<<
>>

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

Сообщение в Win32 представляет собой объект особой структуры, формируемый Windows. Формирование и доставка этого объекта в нужное место в системе по- зволяют управлять работой как самой системы Windows, так и загруженных Windows-приложений.
Инициировать формирование сообщения могут несколь- ко источников: пользователь, само приложение, система Windows, другие прило- жения. Именно наличие механизма сообщений позволяет Windows реализовать многозадачность, которая при работе на одном процессоре является, конечно же, псевдомультизадачностью. Windows поддерживает очередь сообщений для каж- дого приложения. Запуск приложения автоматически подразумевает формирова- ние для него собственной очереди сообщений, даже если это приложение и не бу- дет ею пользоваться. Последнее маловероятно, так как в этом случае у приложения не окажется связи с внешним миром и оно превратится в «вещь в себе». Формат всех сообщений Windows одинаков и описывается структурой, шаб- лон которой содержится в файле winuser.h: /* * Message structure ` */ typedef struct tаgМSG { НWND hwпd; UI NT message; WPARAM wParam; LPARAM 1Раrаm; DWORD time; ■ POINT pt; } MSG, *РМSG, NEAR *NРМSG, FAR *LРМSG; В этой структуре все типы данных вам знакомы, за исключением одного — POINT.
Этот тип данных описан во включаемом файле wiпdеf.h и представляет собой струк- туру вида typedef struct tagPOINT { LONG х; LONG у;} POINT, *РРОINТ, NEAR *NРРОINТ, FAR *LРРОINТ; На основе этого описания в файл wiпdоwsА.h помещено эквивалентное описа- ние этой структуры в соответствии с синтаксисом ассемблера: POINT strue X ULONG О у ULONG Θ ends MSG strue meshwnd HWiND 0 1 mes UINT? wParam UINT? IParam UINT? time dd 0 POINT struc {} ends Поле meshwnd структуры MSG содержит значение дескриптора окна, которому предназначено сообщение.
Это тот самый дескриптор, который возвращается функ- цией CreateWin do wExA и, соответственно, однозначно идентифицирует окно в сис- теме. Не забывайте, что приложение обычно имеет несколько окон, поэтому зна- чение в поле meshwnd помогает приложению идентифицировать нужное окно. В поле mes Windows помещает 32-разрядную константу — идентификатор со- общения, однозначно идентифицирующий тип сообщения. Для удобства все эти константы имеют символические имена, начинающиеся с префикса WМ_ (Window Message). Посмотрите, каким образом они определены в файле winuser.h. Во включа- емом файле для программ на ассемблере wi∩З2.iпс (и нашем варианте этого фай- ла — windowsA.h) тоже содержатся некоторые из этих констант. Если в ходе работы вам понадобятся отсутствующие константы, возьмите их из включаемых файлов компилятора C/C++, исправив описание в соответствии с синтаксисом ассембле- ра. В программе на языке C/C++ эти константы используются в оконной функ- ции оператором switch для принятия решения о том, какая из его ветвей будет исполняться. В оконной функции каркасного Windows-приложения на ассем- блере (строки 163-232) этот оператор моделируется командами условного и безусловного переходов (строки 168-174), а также командой cmр, в качестве второго операнда которой и выступает константа, обозначающая определен- ный тип сообщения. Поля IРаrаm и wParam предназначены для того, чтобы система Windows могла разместить в них дополнительную информацию о сообщении, необходимую для его правильной обработки. Эти поля, например, используются при обработке со- общений о выборе пунктов меню или о нажатии клавиш. В поле time Windows записывает информацию о времени, когда сообщение было помещено в очередь сообщений. И наконец, поле POINT содержит координаты указателя мыши в момент поме- щения сообщения в очередь. . Итак, представим, что в системе произошло какое-то событие, например, неко- торому приложению необходимо перерисовать свое окно, в результате Чего систе- ма Windows сформировала сообщение WM_PAINT.
Данное сообщение попадает в очередь сообщений приложения, создавшего окно. Для того чтобы приложение могло обработать это (или любое другое) сообщение, ему необходимо сначала его обнаружить в очереди сообщений. С этой целью после отображения окна на экра- не программа «входит» в специальный цикл, называемый циклом обработки со- общений (строки 139—156). Выйти из этого цикла можно только по приходу сооб- щения WM_QUIT. В этом случае функция GetMessageA возвращает нулевое значение, и команда условного перехода в строке 146 передает управление на конец цикла обработки сообщений. В случае прихода других сообщений функция GetMessageA возвращает ненулевое значение, в результате чего и осуществляется вход непо- средственно в тело цикла обработки сообщения. Функции GetMessageA передается несколько параметров (строки 140-143): ⅜ message — указатель на экземпляр структуры MSG (строка 42). Во время работы функция GetMessageA извлекает сообщение из очереди сообщений приложения и на основе информации в нем инициализирует поля экземпляра структуры message. Таким образом, приложение получает полный доступ ко всей инфор- мации в сообщении, сформированном Windows; № hWпd— в поле передается дескриптор окна, сообщения для которого должны будут выбираться функцией GetMessageA. Параметр позволяет создать своеоб- разный фильтр, заставляющий функцию GetMessageA выбирать из очереди и пе- редавать в цикл обработки сообщений сообщения лишь для определенного окна данного приложения. Если hWnd = NULL, то GetMessageA будет выбирать из оче- реди сообщения для всех окон; *1 wМsgFiltеrМiп и wМsgFiltеrМах — значения данных параметров также позволяют создавать фильтр для выбираемых функцией GetMessageA сообщений. Они за- дают диапазон номеров сообщений (поле mеs структуры MSG), которые будут выбираться из очереди функцией GetMessageA и передаваться в цикл обработки сообщений. Параметр wМsдFйtеrМiп задает минимальное значение параметра mes, а параметр wMsgFilterMax, соответственно, максимальное значение.
Функция GetMessageA выполняет следующие действия. 1. Постоянно просматривает очередь сообщений. 2. Выбирает сообщения, удовлетворяющие заданным в функции параметрам. 3. Заносит информацию о сообщении в экземпляр структуры MSG (строка 42). 4. Передает управление в цикл обработки сообщений. Цикл обработки сообщений (строки 147-155) состоит всего из двух функций: TranslateMessage и DispatchMessageA. Эти функции имеют единственный параметр — указатель на экземпляр структуры MSG, предварительно заполненный информа- цией о сообщении функцией GetMessageA. Функция TranslateMessage предназначена для обнаружения сообщений от кла- виатуры для данного приложения. Если приложение самостоятельно не обраба- тывает ввод с клавиатуры, то эти сообщения передаются для обработки обратно Windows. Функция DispatchMessageA предназначена для передачи сообщения оконной функции. Такая передача производится не напрямую, так как сама DispatchMessageA ничего не знает о месторасположении оконной функции, а косвенно — посредством системы Windows. Это делается следующим образом: 1. Функция DispatchMessageA возвращает сообщение операционной системе. 2. Windows, используя описание класса окна, передает сообщение нужной окон- ной функции приложения. 3. После обработки сообщения оконной функцией управление возвращается опе- рационной системе. 4. Windows передает управление функции DispatchMessageA. . 5. DispatchMessageA завершает свое выполнение. Так как вызов функции DispatchMessageA является последним в цикле, то управ- ление опять передается функции GetMessageA, которая выбирает очередное сооб- щение из очереди сообщений и, если оно удовлетворяет параметрам, заданным при вызове функции, выполняет тело цикла. Цикл обработки сообщений выполняется до тех пор, пока не приходит сообщение WM_QUIT. Получение этого сообщения — единственное условие, при котором программа может выйти из цикла обработки сообщений.
<< | >>
Источник: В. И. Юров. Assembler. Учебник для вузов. 2-е изд. 2003

Еще по теме Цикл обработки сообщений:

  1. Когда нарушается цикл
  2. ЦИКЛ
  3. Цикл вины
  4. Цикл 2х7
  5. Эволюционный цикл
  6. Универсальный цикл
  7. Глава 5 СЕМЕЙНОЕ ВДИНСТВО И ЖИЗНЕННЫЙ ЦИКЛ СЕМЬИ
  8. ИНФОРМАЦИЯ: ОБРАБОТКА ПОСЛЕДОВАТЕЛЬНАЯ (
  9. ИНФОРМАЦИЯ: ОБРАБОТКА ПАРАЛЛЕЛЬНАЯ
  10. Статистическая обработка.
  11. ТЕОРИЯ УРОВНЕЙ ОБРАБОТКИ
  12. Обработка материалов
  13. Обработка результатов
  14. ГЛАВА ДЕВЯТАЯ ОБРАБОТКА ИНФОРМАЦИИ В УМЕ
  15. Алгоритм обработки результатов.
  16. ДАННОЕ: ОБРАБОТКА СТАТИСТИЧЕСКАЯ
  17. Обработка материала
  18. Пример обработки протокола.