Событийное управление программами



Именно Windows вызывает программу пользователя. Этот процесс осуществляется следующим образом: программа ждет, пока не получит сообщение от Windows. Сообщение передается программе через спец функцию, вызываемую Windows. После получения сообщения программа выполняется, чтобы совершить соотв действие. Несмотря на то, что программа для ответа на сообщение может вызвать одну или несколько ф-ци API, именно Windows инициализирует всю это деятельность. Это не что иное, как основанная на сообщениях взаимодействие Windows с программой и именно оно диктует общую форму всех программ для Windows.

 

Сообщение. Цикл обработки сообщений. Очередь сообщений.

В процессе работы, Windows "общается" с каждым объектом посредством системных сообщений. При возникновении определенных событий, Windows сообщает об этом окну приложения, посылая ему соответствующее сообщение. Окно, после получения сообщения, должно обработать его и возвратить результат обратно в систему.

Цикл обработки сообщений. Он состоит из управляющей структуры while, которая при каждом проходе цикла получает очередное сообщение из очереди, посредством функции GetMessage(), затем переводит все сообщения от виртуальных клавиш в символьные сообщения с помощью функции TranslateMessage(), и после этого отсылает полученное сообщение на обработку оконной процедуре, используя функцию DispatchMessage().Для каждого приложения Windows организует отдельную очередь сообщений прикладной программы, которая по умолчанию вмещает до 8 сообщений.

 Для извлечения сообщений из очереди приложения существуют функция:

Функция GetMessage
Описание:

function GetMessage(var Msg: TMsg; Wnd: HWnd; MsgFilterMin, MsgFilterMax: Word): Bool;
Паpаметpы:
Msg: принимающая структура TMsg.
Wnd: Окно назначения сообщений или 0 для всех окон в прикладной задаче.
MsgFilterMin: Нуль в случае отсутствия фильтрации или wm_KeyFirst только для клавиатуры или wm_MouseFirst только для мыши.
MsgFilterMax Нуль в случае отсутствия фильтрации или wm_KeyLast только для клавиатуры или wm_MouseLast только для мыши.
ФункцияTranslateMessage
Описание:

function TranslateMessage(var Msg: TMsg): Bool;
Пеpеводит комбинации wm_KeyDown/Up в wm_Char или wm_DeadChar и комбинации wm_SysKeyDown/Up в wm_SysChar или wm_SysDeadChar и напpавляет символьное сообщение в очеpедь пpикладной задачи.
Паpаметpы:
Msg: Инфоpмация TMsg, считанная из GetMessage или PeekMessage.
После трансляции сообщение диспетчируется оконной процедуре:

Функция DispatchMessage
Описание:

function DispatchMessage(var Msg: TMsg): Longint;
Паpаметpы:
Msg: Стpуктуpа TMsg.
-------------------------------------------------------------------------------------------------------

Это последняя часть программы WinMain().

switch (message)

{case WM_COMMAND: wmId = LOWORD(wParam);wmEvent = HIWORD(wParam);

switch (wmId)

{case IDM_ABOUT:

...

break;

case IDM_EXIT:

...

default:

return DefWindowProc(hWnd, message, wParam, lParam);     }break;

case WM_PAINT:

...

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:return DefWindowProc(hWnd, message, wParam, lParam);}

Его целью является получение и обработка сообщений, передаваемых операционной системой. Эти сообщения ставятся в очередь, откуда они потом (по мере готовности программы) выбираются функцией API GetMessage():

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

Выбираемые из очереди сообщения сохраняются в структуре, указатель на которую представляет параметр msg. Все сообщения Windows имеют структуру типа MSG, определяемую следующим образом:

typedef struct tagMSG {

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

UINT   message; //собственно сообщение

WPARAM wParam;  //дополнительная информация

LPARAM lParam;     //к сообщению

DWORD  time;          //время посылки сообщения

POINT     pt;                 //положение курсора мыши

} MSG

В поле hwnd структуры MSG записывается дескриптор окна, которому адресовано сообщение; тип сообщения записывается в 32-разрядное поле message, а дополнительная информация (параметры сообщения) – в поля wParam и lParam. Типы WPARAM и LPARAM определены при помощи typedef соответственно как UINT и LONG.

GetMessage() возвращает нуль, когда пользователь завершает программу. Иначе возвращается ненулевое значение.

 


Дата добавления: 2019-02-13; просмотров: 279; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!