Программирование устройств в Windows: Методические указания к выполнению практических и лабораторных работ по курсу “Операционные системы, среды и оболочки”, страница 3

Прежде чем продолжать, следует сказать о причудливой форме венгерской записи. Ее причудливость заключается в обычае предварять буквой имя переменной. Это делается для облегчения идентификации типа переменных. Другими словами, "h" в hPrevInstance показывает, что эта переменная имеет тип HINSTANCE или HANDLE. Подобным образом "n" в nCmdShow определяет целое значение.

Определение типов переменных в WINDOWS приведено в таблице 1.

Таблица 1

Префикс

Тип

Тип в Windows

B

Булевский

BOOL

By

Однобайтовое беззнаковое целое

BYTE

C

Символ

Dw

Четырехбайтовое беззнаковое целое

DWORD

Fn

Функция

H

Целое без знака (UINT)

HANDLE

I

Целое

L

Длинное целое

LONG

lp

Длинный указатель

N

int или short

S

Строка

Sz

ASCIIZ-строка

w

Беззнаковое целое

WORD

В третьей колонке представлены различные новые типы и которые часто используются в Windows-программах. Они служат той же цели, что и тип HINSTANCE.

Справочное руководство можно найти в файле WINDOWS.H. 

Третий параметр, передаваемый главной программе IpszCmdParam, предназначен для идентификации этого параметра как длинного указателя ASCIIZ-строки, в данном случае содержащей параметры, передаваемые программе на старте.

Последний параметр главной программы позволяет определить, должна ли программа начинаться в максимизированном, минимизированном или нормальном состоянии. Когда ncmdShow установлено равным SW_SHOWMAXIMIZED, основное окно программы появляется в максимизированном виде. Параметр SW_SHOWMINIMIZED соответствует минимизированному виду, а по умолчанию назначается SW_SHOWNORMAL.

Последняя часть заголовка главной программы — это использование слова CALLBACK. Раньше вместо него использовались слова FAR PASCAL. Новое слово было выбрано, чтобы обеспечить совместимость с операционными системами вроде Windows NT, где не используется слово FAR. Все процедуры, помеченные как CALLBACK, автоматически объявляются использующими соглашение о вызовах языка PASCAL. Это означает, что когда параметры передаются в эти процедуры, они помещаются в стек, начиная с левого и кончая самым правым. Windows использует соглашение о вызовах языка PASCAL потому, что так быстрее.

Основной момент, о котором нужно помнить, состоит в том, что в течение жизни приложения Windows посылает ему сообщения о действиях, предпринимаемых пользователем или остальными частями среды. Эти сообщения помещаются в очередь, куда функция GetMessage при желании может заглянуть. Когда сообщение выбирается из очереди, оно помещается в структуру, которая выглядит следующим образом. После того как сообщение взято из очереди сообщений, оно передается в Translate-Message, где соответствующая обработка помогает сделать его понятнее. Например, если нажимается функциональная клавиша, сообщение сначала помещается в очередь в довольно абстрактной форме. Функция TranslateMessage делает его гораздо легче для понимания.  Затем функция DispatchMessage передает сообщение в специальную оконную процедуру, которой в данном случае является WndProc. После того как сообщение передано, снова вызывается функция GetMessage, чтобы взять из очереди другое сообщение, если таковое имеется.

Важно понимать, что этот или подобный ему цикл постоянно выполняется в течение всей жизни приложения. Этот процесс никогда не останавливается. Он составляет суть любой Windows-программы. Цикл опроса сообщений постоянно бегает по кругу. Этот процесс без конца повторяется в течение большей части жизни типичной Windows-программы. Сначала сообщения поступают из операционной среды, а затем передаются в WndProc. Обычно это означает, что сообщения переходят в оконную процедуру, где они обрабатываются индивидуально. Оттуда они могут быть переданы оконной процедуре обработки сообщений по умолчанию — DefWindowProc. DefWindowProc умеет отрабатывать по умолчанию почти все виды поведения, ассоциированные с конкретным типом окна. Например, она знает, как обрабатывать действия мышью, минимизирующие или максимизирующие окно, равно как и действия, растягивающие или сжимающие окно.