Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab2.doc
Скачиваний:
2
Добавлен:
12.11.2019
Размер:
964.1 Кб
Скачать

2.3. Цикл сообщений

В конце функции WinMain() расположен цикл сообщений. Он является неотъем­лемой частью всех приложений Windows и предназначен для принятия и обработки сообщений, посылаемых Windows 95. Когда приложение выполняется, ему непре­рывно посылаются сообщения. Они хранятся в очереди сообщений приложения до тех пор, пока не будут прочитаны и обработаны. Каждый раз, когда приложение собирается прочесть очередное сообщение, оно должно вызвать API-функцию GetMessage(), которая имеет такой прототип:

BOOL GetMessage (LPMSG msg, HWND hwnd, UINT min, UINT max) ;

Информация, связанная с сообщением, будет записана в структуру, на которую Указывает параметр msg. Все сообщения, посылаемые окнам, представляются в виде структуры типа MSG, которая определена следующим образом:

HWND hwnd; /* дескриптор окна, которому послано сообщение */

UINT message; /* идентификатор сообщения */

WPARAM wParam; /* информация, зависящая от сообщения */

LPARAM IParam; /* дополнительная информация */

DWORD time; /* время, когда было послано сообщение */

POINT pt; /* координаты курсора мыши */

} MSG;

Дескриптор окна, которому послано сообщение, содержится в поле hwnd. В Windows 95 каждое сообщение представляется 32-разрядным числом, записываемым

в поле message. Дополнительная информация, связанная с сообщением, указывается

в полях wParam и lParam. Тип WPARAM определен с помощью typedef-декларации

как UINT, а тип LPARAM — как LONG.

Время, когда было послано сообщение, задается в миллисекундах в поле time. В поле pt содержатся координаты курсора мыши на момент передачи сообщения.

Координаты записываются в структуру типа POINT, которая определена следующим образом:

typedef struct tagPOINT {

LONG x,y; } POINT;

Если очередь сообщений приложения пуста, то вызов функции GetMessage() передаст управление назад в Windows.

Параметр hwnd функции GetMessage() определяет, для какого окна необходимо получить сообщение. Если в приложении несколько окон, то желательно, чтобы сообщения принимались каждым из них отдельно. Если же необходимо передавать сообщения непосредственно приложению, то в качестве данного параметра нужно задать NULL.

Оставшиеся два параметра функции GetMessage() определяют диапазон иденти­фикаторов принимаемых сообщений. Как правило, приложение принимает все сообщения. В этом случае параметры min и max должны задаваться равными нулю, что и сделано в данной программе.

Функция GetMessage() возвращает ноль, когда пользователь завершает работу с программой, что эквивалентно завершению цикла сообщений. В противном случае возвращается ненулевое значение.

В цикле сообщений вызываются две функции. Первая из них — это API-функция TranslateMessage(). Она преобразует виртуальные коды клавиш, генерируемые Win­dows 95, в сообщения клавиатуры. Хотя эта функция не обязательно должна использоваться во всех приложениях, тем не менее, большинство программ ее вызывают для корректной работы с клавиатурой.

Когда сообщение прочитано и преобразовано, оно должно быть передано назад в Windows с помощью API-функции DispatchMessage(). Windows будет хранить это сообщение до тех пор, пока не сможет передать его программе в качестве параметра функции окна.

Когда цикл сообщений завершается, функция WinMain() также завершает свое выполнение, возвращая Windows 95 значение поля msg.wParam. Это поле содержи код возврата, генерируемый при завершении программы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]