Загрузка...

ОПЕРАЦИОННАЯ ОБОЛОЧКА WINDOWS


4. ОПЕРАЦИОННАЯ ОБОЛОЧКА WINDOWS

Целью работы является ознакомление с основными концепциями опе-
рационной оболочки MICROSOFT WINDOWS, ее структурой и особенностями
создания приложений.

4.1. КОНЦЕПЦИЯ MICROSOFT WINDOWS

Корпорация Microsoft обьявила о начале разработки «графической»
операционной оболочки WINDOWS 10 ноября 1983 г. Первоначально Micro-
soft начала создавать универсальный набор графических процедур,
предназначенный для вывода графики на различные типы графических ус-
тройств (принтеров). Вскоре после начало работ был развернут новый
проект по созданию графической операционной оболочки для MS-DOS. Не-
ожиданный интерес пользователей IBM-совместимых компьютеров к сред-
ствам графического интерфейса был вызван потребностью вывода графи-
ческого изображения на самые различные типы устройств ввода-вывода
(принтеры, видеосистема, плоттеры и т.д.), не заботясь об их типах,
характеристиках и особенностях. Создателям прикладного программного
обеспечения хотели использовать в своих программах функции графичес-
кого интерфейса, которые обеспечивал бы независимый от устройства
графический вывод.
Хотя многие особенности и свойства WINDOWS кардинальным образом
изменились в последующем, некоторые положения были ясны с самого на-
чала. WINDOWS должна быть многозадачной, т.е. должна позволять за-
пускать несколько программ одновременно. WINDOWS должна работать со
всеми типами дисплеев и принтеров. И, поскольку пользователям очень
трудно отказаться от привычных программных средств, WINDOWS должна
позволять запускать программы операционной системы MS-DOS. Последняя
цель оказалась настолько трудной в реализации, что задержала весь
проект на многие месяцы.
В ноябре 1985 года WINDOWS была выпущена, но в течении двух лет
она не оказала большого влияния на рынок операционных систем и не
стала альтернативой MS-DOS, как на то надеялась Microsoft.
С 1987 г. ситуация начала меняться. Начали появляться мощные и
известные приложения, переписанные для работы под WINDOWS: издатель-
ская система PageMaker, процессор электронных таблиц Excel, тексто-
вый процессор Word и т.д.
С выходом третьей версии WINDOWS стало ясно, WINDOWS не просто
завоюет прочное место на рынке программного обеспечения, но станет
основой стратегической политики Microsoft в области операционных
систем для персональных компьютеров.

4.1.1. РАЗДЕЛЕНИЕ РЕСУРСОВ И МНОГОЗАДАЧНОСТЬ. WINDOWS запуска-
ется на выполнение как обычная программа MS-DOS. Однако она берет на
себя почти все функции по управлению памятью, процессами, вводом-вы-
водом, оставляя управление файловой системой MS-DOS. Файловая систе-
ма — едниственное, что доведено в MS-DOS до логического завершения.
К тому же, изменив файловую систему, крайне трудно было бы обеспе-
чить совместимость с существующим для MS-DOS программным обеспече-
нием.
На рисунке 4.1 приведена функциональная схема взаимодействия
WINDOWS, MS-DOS и аппаратный средств ПЭВМ. Если в MS-DOS программа
самостоятельно управляла практически всеми ресурсами ПЭВМ, то при-
ложение (программа) WINDOWS работает на качественно другом, более
высоком уровне. Программируя в WINDOWS, вы имеете в своем распоряже-
нии богатый набор графических процедур, применимых ко всем типам
графических устройств. Для того чтобы преобразовать универсальную
графику в команды конкретного принтера, дисплея или плоттера, в Win-

20

™ќќќќќќќќќќќќќќќќќќќќќќќќќќќќќќќќќќќќќ‹
Љ Приложения для WINDOWS (программы) Љ
?ќќќќќќќќќќќќќќќќќќќќќќќќќќќЎќќќќќќЎќќЊ
ѓ ѓ
™ќќќќќќќќќќќќ‹ ™ќќќќќќќќќќќќќќ‹ ™ќќџќќќќќќџќќ‹
Љ Аппаратные Љ Љ Драйверы Љ Љ Ядро Љ
Љ средства Љ Љ WINDOWS Љ Љ WINDOWS Љ
њќќќќќќќќќќќќ‰ њќќќќќќќќќќќќќќ‰ њќќќќќќќќќќќќ‰
Љ Дисплей Љ<”””>Љ DISPLAY.DRV Љ<”””””””>Љ GDI.EXE Љ
Љ Принтер Љ<”””>Љ PRINTER.DRV Љ Љ (графика) Љ
—””””””””””””† —””””””””””””””† —””””””””””””†
Љ RS-232 Љ<”””>Љ COMM.DRV Љ<”””””””>Љ USER.EXE Љ
Љ Звук Љ<”””>Љ SOUND.DRV Љ Љ (интерфейс Љ
Љ Таймер Љ<”””>Љ SYSTEM.DRV Љ Љ приложения)Љ
Љ Клавиатура Љ<”””>Љ KEYBOARD.DRV Љ Љ Љ
Љ Мышь Љ<”””>Љ MOUSE.DRV Љ —””””””””””””†
—””””””””””””† ?ќќќќќќќќќќќќќќЊ Љ KERNEL.EXE Љ
Љ ОперативнаяЉ<””””””””””””””””””””””””””””>Љ (ядро) Љ<”Џ Љ память Љ ™ќќќќќќќ‹ ?ќќќќќќќќќќќќЊ ѓ —””””””””””””† Љ BIOS Љ ™ќќќќќќќќќќќќќќќќќќќќќќќќќ‹ ѓ Љ Диски Љ<”Џ њќќќќќќќ‰ Љ Резидентная часть MS-DOSЉ ѓ ?ќќќќќќќќќќќќЊ ѓ ЉПринтерЉ њќќќќќќќќЎќќќќќќќќќќќќќќќќ‰ ѓ ђ”>Љ Диски Љ<”>ЉДрайверыѓФайловая системаЉ<”© ?ќќќќќќќЊ ?ќќќќќќќќџќќќќќќќќќќќќќќќќЊ Рис. 4.1. Функциональные связи в WINDOWS dows используются специальные драйверы устройств. Таким образом, приложение WINDOWS не имеет возможности обращения к устройствам вво- да-вывода напрямую, минуя вызов графических функций. Одной из наиболее существенных особенностей WINDOWS является то, что под ее управлением можно одновременно выполнять несколько программ (приложений). Программа, написанная под MS-DOS, "предпола- гает", что в ее распоряжении находятся все ресурсы компьютера. В WINDOWS же различные выполняющиеся приложения делят между собой эти ограниченные ресурсы, распределение которых осуществляеся по запро- сам программ (приложений). Основной целью WINDOWS является обеспечение визуального доступа к большинству приложений одновременно, для чего каждому приложению выделяется часть экрана, называемого окном (window). Функции поддер- жки окна автоматически выполняются WINDOWS и прикладной программист не должен заботится о том, как изменить размеры окна, или как обес- печить взаимодействие одного приложения с другим путем передачи дан- ных между приложениями. Все это берет на себя WINDOWS. Правильный вызов функций создания окна приложения автоматически подключает все возможности оконного и графического интерфейса. Предоставляя в распоряжение программиста мощные средства прог- раммирования как взаимодействия с пользователем, так и взаимодей- ствия между приложениями с лихвой окупают накладываемые WINDOWS ог- раничения, значительно сокращая время разработки и повышая качество программного обеспечения, его независимость от аппаратных средств. 4.1.2. МЕХАНИЗМ СООБЩЕНИЙ. Основным средством обмена данными между приложением и WINDOWS, а также между несколькими приложениями является механизм сообщений. Сообщение предстваляет собой структуру данных, поля которой содержат все необходимое для идентификации каж- дого конкретного события в системе, будь то нажатие клавишина на клавиатуре, конец бумаги на принтере и т.д. Посредством сообщений приложение получает данные о событиях в системе WINDOWS, касающиеся данного приложения. 21 Все внешние по отношению к приложению события соответствующим образом кодируются и в виде сообщений передаются приложению. Сообще- ния, которые получает приложения, возникают в результате действий пользователя или взаимодействия с другими приложениями. При помощи сообщений приложение получает данные от таймера, о нажатии и отпус- кании клавиши на клавиатуре и т.д. Например, приход сигнала от тай- мера кодируется сообщением WM_TIMER, а если пользователь изменил размеры окна приложения, то WINDOWS посылает приложению сообщение WM_PAINT, которое говорит о том, что пользователь изменил окно при- ложения и необходимо перерисовать содержимое окна. Каждое приложение имеет по крайней мере одно окно - главное ок- но приложения и состоит из двух принципиально важных модуля: WinMain и WndProc. Вызов главной функции программы (функция Main() программы на Си в MS-DOS) в WINDOWS заменяется на вызов функции WinMain(), определе- ние которой должно присутствовать в каждой программе и которой пере- дается управление после загрузки приложения в оперативную память. WinMain содержит помимо необходимой инициализации и цикл обработки сообщений, который получает сообщения от WINDOWS, и если это необхо- димо - вызывает функцию обработки сообщений WndProc; в случае получе- ния сообщения WM_QUIT - завершает работу приложения. Рассмотрим, как взаимодействует приложение с WINDOWS при обра- ботке, например, нажатия клавиши на клавиатуре (рис.4.2). При пос- туплении сигналов от клавиатуры, аппаратная часть формирует асинх- ронные прерывания, которые обрабатываются драйвером KEYBOARD.DRV. В результате обработки прерывания драйвером вызывается процудура в мо- дуле USER.EXE, которая формирует соответствующую структуру данных - сообщение. Это сообщение содержит полные данные о событии и помеща- ется этой процедурой в системную очередь WINDOWS. Приложение WINDOWS WINDOWS Инициализация ™ќќќќќќќќќќќќ‹ ѓ ™ќќќќќќќќќќќќќќќќќќќќќ‹ ЉЄ””””””””””ЏЉ ѓ Љ Є”””””””””””””””””Џ Љ ™ќќќќќќќќќќќќ‹ Љѓ WinMain Є•§<””””””† ѓСистемная очередь“<§””””†KEYBOARD.DRVЉ Љ“”””””””Џ ђ•§””””””>† ђ””””””””’””””””””© Љ ?ќќќќќЎќќќќќќЊ
Љѓ Цикл ђ””„ЉWM_CHARЉ Є”””””‘””””Џ Љ Є””””‘”””””Џ
ЉѓобработкиЄ•§”<”””””§””””„ Очередь ѓ Љ ѓ Нажатие ѓ Љѓсообщенийђ•§”””””>”§”Џ ѓприложенияѓ Љ ѓ клавиши ѓ
Љђ””””””””””©Љ Љ ѓ ђ””””””””””© Љ ђ””””””””””©
ЉЄ””””””””””ЏЉ Љ ѓ Љ ™ќќќќќќќќќќќќ‹
Љѓ WndProc Є•§”<”””””§”© TextOut() Љ Љ Окно Љ Љѓ ђ•§”””””>”§”””””””””””””””””””””§””>”† приложения Љ
Љђ””””””””””©Љ Љ Љ ?ќќќќќќќќќќќќЊ
?ќќќќќќќќќќќќЊ ?ќќќќќќќќќќќќќќќќќќќќќЊ

Рис. 4.2. Взаимодействие приложения с WINDOWS

Системная очередь в WINDOWS одна. Сообщения, которые помещают-
ся в системную очередь, распределяются затем по приложениям. Для
каждого приложения WINDOWS создает отдельную очередь. Распределение
сообщений по очередям приложений заключается в том, что сообщение
извлекается из системной очереди, определяется, какому приложению
(окну) предназначено данное сообщение и помещается в очередь соот-
ветствующего приложения. Эту работу осуществляет модуль USER.EXE.
Обработку очереди приложения осуществляет уже само приложение. Для
этого существует цикл обработки сообщений, который извлекает сооб-
щение (например, WM_CHAR) из этой очереди через вызов соответствую-

22

щей функции WINDOWS и направляет его в процедуру обработки сообще-
ний WndProc, опять таки, через вызов соответствующей функции WIN-
DOWS. Конкретные действия по обработке сообщений предпринимаются уже
в WndProc (например, вызывает функцию TextOut, которая выводит сим-
вол в область окна приложения).
Устройства WINDOWS являются разделяемыми устройствами — их со-
общения могут предназначаться любому из запущенных приложений. При-
ложение, которому направляется то или иное сообщение от разделяемого
устройства, должно находится в ФОКУСЕ ввода, который определяет ка-
кому приложения в данным момент «отдано» это устройство. Фокус ввода
может быть изменен пользователем либо с помощью выбора какого-либо
приложения из списка задач, либо с помощью перемещения курсора в ок-
но приложения и нажатия на клавишу или левую кнопку манипулятора
«мышь».
Механизм сообщений — это средство взаимодействия между множест-
вом приложений и WINDOWS и составляет основу для построения многоза-
дачной среды. Если программа в MS-DOS получает управление при заг-
рузке, передает управление в MS-DOS для получения некоторого обслу-
живания и возвращет управление только по завершению работы, то любое
приложение WINDOWS — не более чем обработчик совокупности реакций на
внешние события и более пассивно (приложение) чем любая программа
MS-DOS.
Сообщения в WINDOWS весьма разнообразны: сообщения манипулятора
«мышь», клавиатуры, окна, системные сообщения, сообщения от других
приложений и т.д. — всего около 15 разновидностей. Но сообщения WIN-
DOWS далеко не равноправны и образуют сложную иерархию: «старшие» со-
общения могут порождать одно или несколько «младших», которые в свою
очередь являются «старшими» по отношению к другим сообщениям. Напри-
мер, при любом нажатие на кнопку манипулятора «мышь» в области окна
WINDOWS формирует сообщение WM_NCHITEST, которое содержит только пер-
вичные данные о координатах курсора внутри текщего окна. Это сообще-
ние может порождать несколько других, например сообщение для удале-
ния текстового курсора на старом месте отображения его на новом, или
сообщение WM_PAINT, если необходимо перерисовать содержимое текущего
окна.
Абсолютно все сообщения из иерархии сообщения могут передавать-
ся функции окна WndProc, однако, если нет необходимости выполнить
какую-то «изощренную» обработки сообщений, то приложение обычно пе-
редает почти все сообщения на стандартную обработку WINDOWS: вызыва-
ется функция DefWindowProc. WINDOWS анализирует переданное ей сообще-
ние и формирует необходимые собщения более высокого уровня, например
по получению сообщения WM_NCHITEST формируется новое сообщение
WM_LBUTTONDOWN или WM_RBUTTONDOWN (нажатие левой или правой кнопки
«миши» соответственно). Зная это, для обработки нажатия на левую
кнопку миши необходимо обработить лишь сообщение WM_LBUTTONDOWN,
экономя на различение этой ситуации.
Если стандартной иерархии сообщений не хватает, имеются сред-
ства, позволяющие ввести свои собственные типы сообщений и обрабаты-
вать их.
Концепция программирования в WINDOWS, таким образом, реализует
основную идею объектно-ориентированного программирования: данные
(сообщения) управляют объектами (окнами). Приложение WINDOWS, создав
окно и подготовив (инициализировав) среду приложения, передает управ-
ление WINDOWS и в дальнейшем, вплоть до завершения работы, получает
управление только при приходе сообщения, предназначенного для данно-
го приложения. Сообщения в WINDOWS первичны, они управляют вызовом
той или иной функции и не зависят от этих функций.

23

4.1.3. ТИПЫ ДАННЫХ WINDOWS. Первой строкой каждой Си-программы
для WINDOWS должна быть директива препроцессора, включающая в про-
цесс компиляции заголовочный файл «windows.h». В файле «windows.h»
определены типы и структуры данных WINDOWS, а также прототипы всех
необходимых функций. Особенность этого заголовочного файла, как и
всей WINDOWS в целом, является интенсивное использование соглашений
для системы программирования PASCAL: WINDOWS первоначально была реа-
лизована на языке PASCAL.
Для обеспечения переносимости Си-программ на другие платформы
(на другие архитектуры ЭВМ) введены нестандартные для языка програм-
мирования Си определения основных типов данных WINDOWS:

#define NEAR near // Переопределение близкого обьекта
#define FAR far // Переопределение далекого обьекта
#define PASCAL pascal // Соглашения языка PASCAL
#define FALSE 0 // Логическое значени «ложь»
#define TRUE 1 // Логическое значени «истина»
typedef int BOOL; // Логическая переменая (FALSE, TRUE)
typedef unsigned char BYTE; // Байт, беззнаковый символ
typedef unsigned int WORD; // Слово, беззнаковое целое
typedef unsigned long DWORD; // Двойное слово, беззнаковое длинное
typedef char near *PSTR; // Близкий указатель на строку
typedef char far *LPSTR; // Далекий указатель на строку
typedef BYTE near *PBYTE; // Близкий указатель на байт
typedef BYTE far *LPBYTE; // Далекий указатель на байт
typedef WORD near *PWORD; // Близкий указатель на слово
typedef WORD far *LPWORD; // Далекий указатель на слово
typedef DWORD near *PDWORD; // Близкий указатель на двойное слово
typedef DWORD far *LPDWORD; // Далекий указатель на двойное слово
#define VOID void // Близкий неопределенный указатель
typedef void far *LPVOID; // Далекий неопределенный указатель

Из простых основных типов данных создаются сложные типы:

typedef WORD HANDLE; // Идентификатор обьекта (дескриптор)
typedef HANDLE *PHANDLE; // Близкий указатель на дескриптор
typedef HANDLE FAR *LPHANDLE; // Далекий указатель на дескриптор
typedef HANDLE HWND; // Дескриптор окна
typedef HANDLE HICON; // Дескриптор иконки приложения
typedef HANDLE HDC; // Дескриптор
typedef HANDLE HMENU; // Дескриптор меню
typedef HANDLE HFONT; // Дескриптор шрифта
typedef HANDLE HBRUSH; // Дескриптор закраски окна
typedef HANDLE HCURSOR; // Дескриптор формы курсора

typedef struct tagMSG { // Тип структуры сообщения WINDOWS
HWND hwnd; // Дескриптор текущего окна
WORD message; // Идентификатор сообщения
WORD wParam; // Дополнительный параметр 1
LONG lParam; // Дополнительный параметр 2
DWORD time; // Время наступления события
POINT pt; // Кордината курсора x и y
} MSG; // Имя структуры сообщения
typedef MSG *PMSG; // Близкий указатель на сообщение
typedef MSG FAR *LPMSG; // Далекий указатель на сообщение

Текст программы в WINDOWS выглядит несколько странно по срав-
нению с обычной программной на языке Си: можно заметить интенсивное
использование сложных имен обьектов, мнемоническое обозначение ко-

24

торых состоит из нескольких частей. Первая часть — префикс, указы-
вает на тип обьекта и может состоять из следующих комбинаций симво-
лов: с — символ, b — логический, i — целое, w — слово, h — дескрип-
тор, dw — двойное слово, l — длинное целое, s — строка символов, sz
— строка символов, оканчивающаяся ‘\0’, fn — функция типа NEAR, p —
указатель, lp — указатель типа FAR и т.д. Например, wVar — перемен-
ная слово; сGet — переменная символ; plszString — длинный указатель
на строку, оканчивающийся символом ‘\0’ и т.п. Само имя переменной
также состоит из нескольких частей, разделенных прописными буквами.
Это значительно облегчает чтение и восприятие имени обьекта. Напри-
мер, wBufferSize — переменная слово, определяющая размер буфера (в
отличие от wbuffersize); hMyWindow — дескриптор окна приложения и
т.п.

4.1.4. УПРАВЛЕНИЕ ОПЕРАТИВНОЙ ПАМЯТЬЮ. Система управления па-
мятью значительно отличается от MS-DOS, что обусловлено многозадач-
ностью WINDOWS. Основу для управления памятью WINDOWS составляет ме-
ханизм упарвления памятью, реализованный в защищенном режиме работы
процессора Intel 80286 и старше. В приложениях WINDOWS нельзя ис-
пользовать стандартные функции Си, такие как malloc() и free().
Необходимо использовать специальные функции LocalAlloc() — для полу-
чения блока памяти требуемого размера, LocalLock() — для фиксации
блока в памяти с целью недопущения его перемещения при «сборке мусо-
ра» и фиксации его по постоянному физическому адресу, LocalUnlock()-
для снятия фиксации блока в памяти и, наконец, LocalFree() — для ос-
вобождения блока памяти.
Послу получения блока памяти функцией LocalAlloc() возвращается
специальный дескриптор блока и последующие операции над памятью вы-
полняются с использование этого дескриптора. При вызове функции
LocalAlloc() можно использовать следующие флаги или их комбинации в
качестве первого параметра:
LMEM_DISCARDABLE — возвращаемый системе блок памяти;
LMEM_MODIFY — возможность модификации флага LMEM_DISCARDABLE;
LMEM_FIXED — фиксированный блок памяти;
LMEM_MOVEBLE — перемещаемый блок памяти;
LMEM_ZEROINIT — заполнение блока памяти нулями.

4.1.5. СОЗДАНИЕ ПРИЛОЖЕНИЙ WINDOWS. Процесс создания приложения
WINDOWS в значительной степени отличается от известного двухстадий-
ного процесса трансляции-компоновки. На рисунку 4.3 покзана схема
процесса создания приложения в среде WINDOWS.
Cоздание приложения в среде WINDOWS разделяется не несколько
этапов:
1) Написание исходных модулей с функцими WinMain() и WndProc()
(файлы *.asm, *.inc, *.c, *.cpp, *.h).
2) Создание с помощью соответствующих утилит файлов ресурсов,
задающих диалоговые окона, битовые шаблоны, курсоры, пиктограммы
(иконки) (файлы *.dlg, *.bmp, *.cur, *.ico соответственно).
3) Создания текстового файла описания ресурсов, описывающиго
используемые диалоговые окона, битовые шаблоны, курсоры, пиктограммы
(файл *.rc).
4) Создания текстового файла описания программного модуля, не-
обходимого для задания параметров его окружения в среде WINDOWS (файл
*.def) и определения свойств приложения.
5) Компиляция всех исходных моделей (компилятор tcc.exe и ас-
семблер tasm.exe) и файлов ресурсов с использование компилятора ре-
сурсов rc.exe.

25

™ќќќќќќќќќќќќќќ‹ ™ќќќќќќќќќќќќќ‹
ЉИсходные файлыЉ Љ Стандартные Љ
Љ *.asm Љtasm.exe Љ библиотеки —”Џ
—””””””””””””””§”””””””Џ Љ *.lib Љ ѓ
Љ Включаемые Љ ѓ ?ќќќќќќќќќќќќќЊ ѓ
Љ файлы *.inc Љ ѓ ѓ
?ќќќќќќќќќќќќќќЊ ѓ ™ќќќќќќќќќќќќќ‹ ѓ
™ќќќќќќќќќќќќќќ‹ ђ”>Љ Обьектные Љ ѓ
ЉИсходные файлыЉ Є”>Љ модули Љ ѓtlink.exe™ќќќќќќќќќќќќќќ‹
Љ *.c, *.cpp Љtcc.exeѓ Љ *.obj Љ ђ””””””””>Љ Выполняемый Љ
—””””””””””””””§”””””””© —”””””””””””””§””””””””””>Љ модуль Љ
Љ Включаемые Љ Љ Ресурсы Љ Є””””””””>Љ *.exe Љ
Љ файлы *.h Љ Є”>Љ *.res Љ ѓ ?ќќќќќќќќќќќќќќЊ
?ќќќќќќќќќќќќќќЊ ѓ ?ќќќќќќќќќќќќќЊ ѓ
™ќќќќќќќќќќќќќќ‹ ѓ ѓ
Љ Файл описанияЉ ѓ ѓ
Љресурсов *.rc Љ rc.exeѓ ѓ
—””””””””””””””§”””””””© ™ќќќќќќќќќќќќќ‹ ѓ
ЉФайлы ресурсовЉ Љ Файл опреде-Љ ѓ
Љ *.dlg, *.bmp Љ Љления модуля —”©
Љ *.cur, *.ico Љ Љ *.def Љ
?ќќќќќќќќќќќќќќЊ ?ќќќќќќќќќќќќќЊ

Рис. 4.3. Cоздание приложения в среде WINDOWS

6) Компоновка с помощью tlink.exe полученных модулей и создания
единого выполняемого файла, описание которого задается в файле опре-
деления модуля *.def.

4.2. ПРИЛОЖЕНИЯ WINDOWS

4.2.1. ОКНА WINDOWS. Рассматривая графическую операционную обо-
лочку нельзя обойтись без подробного рассмотрения, какие окна можно
отображать на экране. Все основные типы окон могут оформлятся с ос-
новными стандартными элементами, показанными на рисунку 4.4.
Тип окна задается 32-битовым беззнаковым целым числом, которое
указывается третим параметром вызова функции CreatWindow() для соз-
дания окна. Этот параметр интерпретируется как комбинация битовых
флагов, определяющие тип окна и его свойства. Допустимые типы окна
определены в файле windows.h и при создании окна:

#define WS_OVERLAPPED 0x00000000L //Перекрывающееся окно
#define WS_POPUP 0x80000000L //Всплывающее окно
#define WS_CHILD 0x40000000L //Дочернее окно
#define WS_MINIMIZE 0x20000000L //Отображение в виде пиктограммы
#define WS_VISIBLE 0x10000000L //Видимость после создания
#define WS_DISABLED 0x08000000L //Создание неактивного окна
#define WS_CLIPSIBLINGS 0x04000000L //Исключение чужих дочерних окон
#define WS_CLIPSIBLINGS 0x04000000L //Исключение чужих дочерних окон
#define WS_CLIPCHILDREN 0x02000000L //Исключение своих дочерних окон
#define WS_MAXIMIZE 0x01000000L //Отображение с max размером
#define WS_BORDER 0x00800000L //Окно с рамкой
#define WS_DLGFRAME 0x00400000L //Окно с заголовком
#define WS_VSCROLL 0x00200000L //Окно с вертик.полосой просмотра
#define WS_HSCROLL 0x00100000L //Окно с гориз. полосой просмотра
#define WS_SYSMENU 0x00080000L //Окно с системным меню
#define WS_THICKFRAME 0x00040000L //Изменение размера окна
#define WS_GROUP 0x00020000L //Окно с кнопкой минимизации
#define WS_TABSTOP 0x00010000L //Окно с кнопкой максимизации

26

Кнопка системного меню
ѓ
ѓ Заголовок окна Кнопка минимизации
ѓ ѓ ѓ
™ќ°ќЎќќќќќќ°ќќќќќќќќќќќќќќќќќќќќќЎќ°ќЎќќќ‹
Љ ќ ѓ Header ѓ  ѓ ”§””” Кнопка максимизации
—”””‘””””””””””””””””””””””””””””‘”””•”””†
Љ ѓ ”§””” Кнопка «вверх»
Љ “”””†
Љ ѓ ”§””” Вертикальная полоса
Љ ѓ Љ прокрутки
Љ Рабочая область окна “”””†
Љ ѓ ”§””” Указатель вертикаль-
Љ “”””† ной прокрутки
Љ ѓ Љ
Љ ѓ Љ
Љ ѓ Љ
Љ “”””†
Љ ѓ ”§””” Кнопка «вниз»
—”””’””””’”””””””””””””””””””””””’”””•”””†
Љ  ѓ ѓ ѓ  ѓ Љ””” Рамка окна
?ќ°ќџќќ°ќџќќќќќќќќќ°ќќќќќќќќќќќќќџќ°ќџќќќЊ
Кнопка ђ Указатель ђ Горизотальная ђ””””””””” Кнопка «вправо»
«влево» горизонт. полоса прокрутки
прокрутки

Рис. 4.4. Cтандартные элементы окна

Битовые флаги можно комбинировать битовой операцией «ИЛИ» («|»)
для получения окна с требуемыми свойствами. В файле windows.h заданы
типовые комбинации флагов в виде констант, например:

#define WS_CAPTION (WS_BORDER|WS_DLGFRAME) //С рамкой и заголов.
#define WS_POPUPWINDOW (WS_POPUP|WS_BORDER|WS_SYSMENU) //Всплывающее

WINDOWS поддерживает три основных типа окон: перекрывающееся,
всплывающее и дочернее. Перекрывающееся окно имеет аттрибут
WS_OVERLAPPED и является основным типом окна. Всплывающее окно зада-
ется флагом WS_POPUP и используется для окон диалога и отображаются
всегда поверх всех окон на экране, выскакивая как поплавок наверх
даже тогда, когда пользователь делает активным другое окно. Дочер-
нее окно задается флагом WS_CHILD, является подчиненным и создается
тогда, когда у приложения уже есть главное (перекрывающееся) окно и
служит, например, для деления родительского окна на области.

4.2.2. ВЫВОД В ОБЛАСТЬ ОКНА WINDOWS. Вывод в WINDOWS может осу-
ществлятся как в рабочую область окна, так и в заголовок. Вывод тек-
ста в заголовок окна выполняется через вызов функции SetWindowText
(см. приложение 2).
Из приложение WINDOWS можно выводить в рабочую область окна как
текст, так и графические изображения. При этом необходимо учитывать
следующие особенности. Во-первых, размер окна может изменяться поль-
зователем и, следовательно, размер окна заранее неизвестен. Во-вто-
рых, после вывод в окно, его размер может быть изменен, что приводит
к необходимости отслеживать эту ситуации и «перерисовывать» содержи-
мое окна. В-третих, приложению неизвестно в какой момент и что необ-
ходимо будет вывести в рабочую область окна т.к. любой вывод иниции-
руется соответствующим сообщением и является результатом его обра-
ботки. В-четвертых, обновление содержимого рабочей области требуется

27

также и в том случае, когда рабочая область окна перекрывается, а
затем снова освобождается окном другого приложения; в этом случае
WINDOWS помещает в очередь соответствующего приложения сообщение
WM_PAINT; приложение может и само поместить сообщение WM_PAINT в
свою очередь вызовом функции UpdateWindows. Пример обработки сооб-
щения WM_PAINT приведен в приложении 2.
Для вывода в область окна необходимо знать дескриптор устрой-
ства, выполняющего операцию вывода. В нашем случае этим устройством
является дисплей а дескриптором устройства является дескриптор окна.
Дескриптор устройства используется для задания функции WINDOWS стан-
дартного указателя на устройство, который определяет соответствующую
структуру данных, называемой контекстом устройства (Device Context —
DC). Контекст устройства описывает геометрические и другие специаль-
ные параметры, необходимые для графического и текстового вывода.
Алгоритм вывода в рабочую область окна можно представить следу-
ющим образом:
1) Запрос о создании контекста устройства (функция BeginPaint
или GetDC);
2) Операция вывода (TextOut, Rectangl и др.);
3) Освобождение контекста устройства (EndPaint или ReleseDC).
Для получения области перерисовки (а она может быть меньше окна
приложения, если не все изображение «запортилось») функции BegPaint
необходимо передать адрес структуры перерисовки PAINTSTRUCT, поля
которой содержат необходимые данные, в том числе и координаты пря-
моугольника, подлежащего обновлению.
Если при отрисовке не используется структуру перерисовки, то
можно использовать для получения и освобождения контекста устройства
функции GetDC и ReleseDC соответственно.
В примере в приложении 2 для получения данных о текущем шрифте
используется функция GetTextMetrics, которая заполняет данные в
структуру TEXTMETRIC. Для правильного вывода последовательности
строк c использованием функции TextOut нам необходимо максимальная
ширина символа шрифта tmMaxCharWidth и расстояние между строками
tmHeight.

4.2.3. КЛАВИАТУРА И МЫШЬ. Всего существует восемь сообщений,
предназначенных для уведомления приложения о нажатии клавиши на кла-
виатуре. Клавиатура WINDOWS разделяемый ресурс, т.е. несколько при-
ложений могут использовать ее одновременно. Окно, поучающее сообще-
ния от клавиатуры находится в фокусе ввода. Функция окна может полу-
чить уведомление о нахождении в фокусе ввода путем анализа сообщения
WM_SETFOCUS. При потере фокуса ввода окну посылается другое сообще-
ние — WM_KILLFOCUS.
При нажатии клавиши WINDOWS посылает сообщение собственно о на-
жатии и отпускании клавиши, а также сообщение о нажатом символе, ко-
торое формируется с учетом клавиш Caps, Shift, Ctrl, Alt и состояния
выдачи символов национального алфавита. Нажатия клавиш делятся на
системные и несистемные. К системным нажатиям относятся следующие
комбинации клавиш:
Alt+Tab — переключения на предыдущее приложение;
Alt+Esc — переключения на следующее приложение;
Alt+<буква> — вызов меню <буква> текущего приложения.
При нажатии/отпускании системной клавиши WINDOWS помещает в
системную очередь сообщения WM_SYSKEYDOWN и WM_SYSKEYUP соответствен-
но, которые сначала поступают напрямую в функцию окна, и если вы пе-
редадите их обработку стандартной функции обработки сообщений WINDOWS
DefWindowProc, то сообщение приведет к резьтату, в противном случае
оно потеряется и вы заблокируете системные операции с клавиатурой.

28

При нажатии/отпускании остальных клавиш WINDOWS передает функ-
ции окна с фокусом ввода сообщения WM_KEYDOWN и WM_KEYUP. Для всех
сообщений клавиатуры параметр lParam cодержит следующие данные:
бит [00-15] — счетчик повтора (при долгом нажатии на клавишу);
бит [16-24] — код OEM клавиши, он же скан-код;
бит [25-26] — не используется;
бит [27-28] — используется WINDOWS;
бит [29] — флаг системной клавиши, нажатие совместно с Alt;
бит [30] — предыдущее состояние клавиши: 0-нажата, 1-отпущена;
бит [31] — текущее состояние клавиши: 0-нажата, 1-отпущена.
Виртуальный код клавиши содержится в параметре wParam сообще-
ния и задает код нажатой специальной клавиши, например, VK_BACK
соответствует клавише BackSpace, а VK_UP — клавише стрелка вверх.
Более подробно о значениях виртуальных кодов и их соответствия кла-
вишам на клавиатуре см. в файле windows.h.
Для перевода сообщений клавиатуры в символьные сообщения в цик-
ле обработки сообщений в функции WinMain используется функция
TranslateMessage, которая формирует по коду нажатой/отпущенной клави-
ши код соответствующего символа в виде сообщения WM_CHAR/WM_DEADCHAR
соответственно, в котором параметр wParam содержит ASCII-код символа.
При использовании манипулятора ввода графических данных типа
«мышь» в очередь приложения, находящегося не только в фокусе ввода,
но и того окна, в котором отображен указатель мыши, помещаются сле-
дующие сообщения:
WM_LBUTTONDOWN — нажатие левой кнопки мыши;
WM_MBUTTONDOWN — нажатие средней кнопки мыши;
WM_RBUTTONDOWN — нажатие правой кнопки мыши;
WM_LBUTTONUP — отпускание левой кнопки мыши;
WM_MBUTTONUP — отпускание средней кнопки мыши;
WM_RBUTTONUP — отпускание правой кнопки мыши;
WM_LBUTTONDBLCLK — двойное нажатие левой кнопки мыши;
WM_MBUTTONDBLCLK — двойное нажатие средней кнопки мыши;
WM_RBUTTONDBLCLK — двойное нажатие правой кнопки мыши;
WM_MOUSEMOVE — перемещение указателя мыши в области окна,
при этом параметр lParam сообщения содержит координаты указателя от-
носительно левого верхнего угла рабочей области окна, причем младшее
с лово содержит х-координату, а старшее — y-координату; параметр
wParam содержит данные о состоянии кнопок мыши и клавиш Ctrl и Shift.

4.3. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ N 3

Для подготовки к работе необходимо ознакомится с порядком ее
проведения, изучить теоретический материал и разобрать программу
OS03, листинг которой приведен в приложении 2. При выполнении инди-
видуального задания используйте справочные данные из справочной сис-
темы компилятора C++ для WINDOWS.

4.3.1. ИЗУЧЕНИЕ РАБОТЫ ПОЛЬЗОВАТЕЛЯ В WINDOWS. Для запуска WIN-
DOWS после приглашения MS-DOS введите команду «WIN», предназначенную
для запуска одноименного командного файла или программы в формате
.СОМ; по истечении некоторого времени на экране появится заставка
пакета, а затем изображение песочных часов, показавающее пользовате-
лю, что процесс загрузки WINDOWS еще не закончен; по окончанию заг-
рузки открывается окно Programm Мanager (Диспетчера Программ), поз-
воляющее выполнять запуск приложений WINDOWS.
Изучите работу пользователя в операционной оболочке WINDOWS,
используя соответствующую команду в меню «Help» («Помощь») диспет-
чера программ и нажав на клавишу F1 на клавиатуре.

29

Примечания.
1. Если окно Диспетчера Программ не раскрыто (свернуто) или не
не раскрыты дочерние окона групп приложений, то раскройте окно Дис-
петчера программ и требуемые группы приложений, установив указатель
манипулятора «мышь» на пиктограмму Диспетчера программ или группы
и двукратно нажмите на левую клнопку манипулятора «мышь». Названия
групп могут задаватся пользователем, но как правило имеются следую-
щие постоянные группы: «Main» («Главная»), «Accessories» («Реквизи-
ты»), «Games» («Игры»), «Applicasions» («Приложения»), «StartUp»
(«Группа запуска») и т.д.
2. Запуск приложения WINDOWS осуществляется установкой курсора
манипулятора «мышь» на пиктограмме приложения с последующим двух-
кратным нажатием на левую кнопку. Однократное нажатие левой кнопки
манипулятора «мышь» для запущенного приложения вызывает появление
системного меню приложения(если задано его отображение при регистра-
ции класса главного окна), из которого можно выбрать одну из возмож-
ных команд (директив), которое осуществляется установкой курсора на
пункт меню и однократным нажатием на левую кнопку.

4.3.2. СОЗДАНИЕ ПРИЛОЖЕНИЯ. Для создания учебного приложения
WINDOWS используется система программирования «Borland C++ for WIN-
DOWS». Найдите пиктограмму интегрированной среды компилятора в груп-
пе «Applicasions» («Приложения») и активизируйте приложение.
Изучите систему меню системы программирования Borland C++ for
WINDOWS.
Загрузите в окно редактора через меню File текст программы
учебного приложения с именем OS02.CPP (приложение 2). Выполните ком-
пиляцию учебного приложения и запустите его на выполнение из интег-
рированной среды.
Изучите возможности, предоставляемые WINDOWS по изменению раз-
меров главного окна учебного приложения, системное меню, заголовок
окна, работу с кнопками минимизации и максимизации и др.

4.4. ИНДИВИДУАЛЬНЫЕ ЗАДАНИЯ К РАБОТЕ N 3.

Выполнение индивидуального задания заключается в создании при-
ложения WINDOWS для исследования учебных вопросов, приведенных в ин-
дивидуальном задании с использованием рекомендованной литературы и
справочной подсистемы системы программирования «Borland C++ for WIN-
DOWS».
Задание 1. Исследовать возможность создания и особенности ис-
пользования нескольких главных окон приложения.
Задание 2. Исследовать создание и особенности использования до-
черних окон в приложении
Задание 3. Исследовать создание и особенности использования
всплывающих окон в приложении.
Задание 4. Исследовать возможность динамического изменения меню
приложения как путем добавления новых пунктов в меню, так и создания
новых меню.
Задание 5. Исследовать обработку команды перерисовки рабочей
области окна приложения с использованием функций GetDC и ReleseDC.
Задание 6. Исследовать обработку команды перерисовки только
«запорченной» области окна приложения с использованием функций
BeginPaint, EndPaint.
Задание 7. Исследовать возможность вывода текста в дочернее ок-
но приложения.
Задание 8. Исследовать возможность вывода текста в всплывающее
окно приложения.

30

Задание 9. Исследовать возможность отображения дочернего окна
при выборе соответствующего пункта меню приложения.
Задание 10. Исследовать возможность отображения всплывающего
окна при выборе соответствующего пункта меню приложения.
Задание 11. Исследовать возможность задания и использования
различных форм курсора для главного окна приложения.
Задание 12. Исследовать возможность создания и использования
различных пиктограмм приложения с выводом их в рабочую область окна.
Задание 13. Исследовать возможность создания в приложении иерар-
хического меню с глубиной вложения более 3.
Задание 14. Исследовать возможность вывода в область окна раз-
личных геометрических фигур
Задание 15. Исследовать возможность вывода в область окна симво-
лов, нажатых на клавиатуре.
Задание 16. Исследовать кодовую таблицу WINDOWS и отобразить ее
в рабочей области окна.

4.5. КОНТРОЛЬНЫЕ ВОПРОСЫ К РАБОТЕ N 4
1. Операционная оболочка Windows.
2. Разделение ресурсов.
3. Многозадачность.
4. Механизм сообщений.
5. Типы данных Windows.
6. Нотация типов данных и имен обьектов в Windows.
7. Управление оперативной памятью.
8. Последовательность создания приложения в Windows.
9. Структура приложения Windows.
10. Окна Windows.
11. Вывод в область окна Windows.
12. Контекст устройства в Windows.
13. Взаимодействие приложения с клавиатурой.
14. Использование манипулятор «мышь» в Windows.

Загрузка...