Сообщения и очереди. Трансляция клавиш ускорения. Фильтрация сообщений

Страницы работы

Содержание работы

5.3. Сообщения и очереди

Вся входная информация для ПП представляется в виде сообщений. Сообщение - это структура данных, которая содержит идентификатор сообщения и параметры сообщения. Содержимое параметров меняется в зависимости от типа сообщения.

Система WINDOWS генерирует сообщение на каждое событие по вводу информации,  такое  как  перемещение  пользователем "мыши"  или нажатие клавиши на клавиатуре. Она также генерирует сообщение, когда необходимо, чтобы ПП выполнила некоторые  действия, такие как прорисовку области пользователя или изменение размеров окна. Большинство сообщений WINDOWS размещает в очереди ПП. Очередь ПП  -  это  очередь  типа  FIFO (первый-в/первый-из),  которая  принадлежит  отдельно каждой прикладной программе. WINDOWS помещает  сообщения,  которые принадлежат  ПП,  в очередь и прикладная программа считывает сообщения, используя функцию GetMessage и направляет их  соответствующей     функции     окна,     используя    функцию DispatchMessage.

WINDOWS посылает некоторые сообщения непосредственно функциям окон ПП и не помещает их в очередь ПП. В основном, сообщение,  которое  не  ставится в очередь, - это некоторое сообщение, которое воздействует только на окно.

Например, функция CreateWindow заставляет WINDOWS послать сообщение WM_CREATE в функцию окна ПП и ожидать до  тех пор,  пока  сообщение  не  будет  обработано  функцией окна. WINDOWS посылает это сообщение непосредственно в функцию  и не помещает его в очередь ПП.

Хотя большинство сообщений генерируется системой WINDOWS, прикладные программы могут создавать свои собственные сообщения и размещать их в очереди ПП других прикладных программ, используя функцию PostMessage.

5.3.1. Выборка сообщений

Основная функция может выбирать сообщения из очереди ПП, используя функцию GetMessage. Эта функция осуществляет поиск очереди ПП для сообщений и возвращает верхнее сообщение в очереди ПП, если оно существует. Если очередь ПП пуста, GetMessage ожидает сообщение, которое будет помещено в очередь. На время ожидания GetMessage передает управление системе WINDOWS, что позволяет другим ПП взять управление и обработать свои собственные сообщения.

5.3.2. Диспетчеризация сообщений

Как только основная функция получает сообщение из очереди, она может передать его функции окна, используя функцию DispatchMessage. Эта функция побуждает WINDOWS вызвать функцию окна, связанную с сообщением, и передать содержимое сообщения в качестве аргументов функции. Функция окна может затем обработать сообщение и выполнить любые запрашиваемые изменения окна. Когда функция окна возвращает управление, WINDOWS возвращает управление основной функции. Основная функция может затем выбрать следующее сообщение из очереди.

5.3.3. Трансляция сообщений

Всякий раз, когда пользователь нажимает клавишу на клавиатуре, WINDOWS генерирует сообщение виртуальной  клавиши. Сообщение  виртуальной клавиши содержит код виртуальной клавиши, который определяет, какая из клавиш была нажата, но не определяет символьное значение этой клавиши. Для того, чтобы найти символьное значение  этой  клавиши,  основная  функция должна  транслировать значение виртуальной клавиши с помощью функции TranslateMessage. Эта функция помещает другое  сообщение  с  соответствующим символьным значением в очередь ПП. Сообщение может затем быть отправлено функции окна.

Функция TranslateMessage может транслировать код виртуальной клавиши в символьное значение в коде ANSI или соответствующее значение в коде OEM. Тип окна, связанного с сообщением, определяет вид трансляции, которая должна иметь место. Это означает, что сообщение TranslateMessage может преобразовать код виртуальной клавиши в единственное символьное значение, в значение специального назначения или в несколько символьных значений, таких как знаки на иностранных языках. Если TranslateMessage генерирует несколько символов, то она помещает несколько сообщений в очередь ПП.

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

Если это необходимо, прикладная программа может послать сообщения виртуальных клавиш непосредственно функции окна ПП, используя функцию SendMessage. Если используется SendMessage, сообщение должно быть передано функциям окна.

Приведенный ниже фрагмент программы иллюстрирует типичный цикл, используемый основной функцией для выборки сообщений из очереди и направления их функциям окна:

int PASCAL WinMain(hInstance,hPrevInstance,lpCmdLine,ShowCmd)

HANDLE hInstance;

HANDLE hPrevInstance;

LPSTR lpCmdLine;

WORD ShowCmd;

. . .

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

TranslateMessage((LPMSG)&msg);

DispatchMessage((LPMSG)&msg);

exit(msg.wParam);

5.3.4. Трансляция клавиш  ускорения

Прикладные программы, которые используют клавиши ускорения, должны загрузить таблицу ускорителей из файла ресурсов, используя функцию LoadAccelerators, а затем транслировать сообщения клавиатуры в сообщения клавиш ускорения, используя функцию TranslateAccelerator. Основной цикл для ПП, которые используют ускорители, должен иметь следующий вид:

while(GetMessage((LPMSG)&msg,(HWND)NULL,0,0))

if(TranslateAccelerator(hWindow,hAccel,(LPMSG)&msg)==0)

TranslateMessage((LPMSG)&msg);

DispatchMessage(LPMSG)&msg);

exit(msg.wParam);

Вызов TranslateAccelerator должен появиться перед стандартными функциями TranslateMessage и DispatchMessage. Более того, поскольку TranslateAccelerator автоматически направляет сообщение ускорения соответствующей функции окна, функции TranslateMessage и DispatchMessage не должны вызываться, если TranslateAccelerator возвращает ненулевое значение.

5.3.5. Контроль очереди

Похожие материалы

Информация о работе