Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метода по ОАиП.doc
Скачиваний:
12
Добавлен:
11.05.2015
Размер:
3.21 Mб
Скачать

Цикл обработки сообщений

Программа получает информацию от пользователя через клавиатуру и мышь. Для каждой программы, работающей в данный момент, Windowsподдерживает «очередь сообщений» (message queue). Когда происходит ввод информации, она преобразуется в «сообщение», которое помещается в эту очередь.

Программа извлекает сообщения из очереди, выполняя блок соответствующих команд, известный как «цикл обработки сообщений» (message loop):

while (GetMessage (&msg, NULL, 0, 0)) {

TranslateMessage (&msg);

DispatchMessage (&msg);

}

return msg.wParam;

Переменная msg– структура типаMSG, определенная следующим образом:

typedef struct tagMSG {

HWND hwnd;

UINT message;

WPARAM wParam;

LPARAM lParam;

DWORD time;

POINT pt;

} MSG;

Тип данных POINT определяется как

typedef struct tagPOINT {

LONG x;

LONG y;

} POINT;

Вызов функции

GetMessage(&msg, NULL, 0, 0);

извлекает сообщение из очереди и в Windowsпередается указатель на структуруmsg; второй, третий и четвертый параметры (NULLили 0) показывают, что программа получает все сообщения от всех окон. СистемаWindowsзаполняет поля структуры сообщений информацией об очередном сообщении из очереди. Поля этой структуры следующие:

hwnd– описатель окна, для которого предназначено сообщение;

message– идентификатор сообщения, который задается в заголовочных файлах и начинается с префиксаWM(оконное сообщение –window message);

wParam– 32-разрядный параметр сообщения, смысл и значение которого зависят от особенностей сообщения;

lParam– 32-разрядный параметр, зависящий от сообщения;

time– время, когда сообщение было помещено в очередь;

pt– координаты курсора в момент помещения сообщения в очередь.

Если поле messageсообщения, извлеченного из очереди, равно любому значению, кромеWM_QUIT(0x0012), то функцияGetMessage возвращает ненулевое значение; сообщениеWM_QUITпрерывает цикл обработки сообщений – программа заканчивается, возвращая числоwParamструктурыmsg.

Функция TranslateMessage (&msg); передает структуруmsgобратно вWindowsдля преобразования сообщения.

Функция DispatchMessage(&msg); передает структуруmsgдля ее обработки соответствующей оконной процедурой (WndProc). После того какWndProcобработает сообщение, оно возвращается вWindows, которая все еще обслуживает вызов функцииDispatchMessage. КогдаWindowsвозвращает управление в программу к следующему за вызовомDispatchMessageкоду, цикл обработки сообщений в очередной раз возобновляет работу, вызываяGetMessage.

Оконная процедура

Оконная процедура определяет, что выводится в рабочую область окна и как окну реагировать на пользовательский ввод.

Оконной процедуре (WndProc) можно назначить любое имя. В программе может содержаться несколько оконных процедур. Оконная процедура всегда связана с определенным классом окна, который регистрируется функциейRegisterClassEx. ФункцияCreateWindowсоздает окно на основе определенного класса окна. На основе одного и того же класса можно создавать несколько окон.

Оконная процедура определяется следующим образом:

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg,

WPARAMwParam,LPARAMlParam);

ее параметры идентичны первым четырем полям структуры MSG.