Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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




 

Последней частью программы WinMain() является цикл обработки сообщений. Такой цикл содержится во всех приложениях для Windows. Его целью является получение и обработка сообщений, передаваемых операционной системой. Эти сообщения ставятся в очередь сообщений приложения, откуда они затем (по мере готовности программы) выбираются функцией 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.

Время посылки сообщения записывается в поле time в миллисекундах. Поле pt содержит координаты курсора мыши в момент посылки сообщения. Структура POINT, в которую записываются эти координаты, определяется так:

typedef struct tagPOINT

{

LONG x,y;

} POINT;

 

Если очередь сообщений приложения пуста, вызов GetMessage() возвратит управ­ление Windows. (Более детально сообщения рассматриваются в следующей главе.)

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

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

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

Внутри цикла обработки сообщений вызываются две функции. Вначале вызывается функция API TranslateMessage(), которая транслирует виртуальные коды клавиш, генерируемые Windows, в клавиатурные сообщения. (Виртуальные коды клавиш рассматриваются в гл. 4.) Хотя это и не является необходимым, большинство приложений вызывают TranslateMessage(), поскольку это позволяет использовать в программе ввод с клавиатуры.

Когда сообщение прочитано и преобразовано, функция API DispatchMcssage() возвращает его обратно к Windows. Windows хранит это сообщение до тех пор, пока оно не будет послано оконной функции приложения.


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


mylektsii.ru - Мои Лекции - 2015-2019 год. (0.006 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал