Процедура обработки сообщений, ее формат и правила написания



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

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

У функции окна имеется четыре аргумента:

  • hWnd - идентификатор окна.
  • msg - код текущего сообщения.
  • wParam и lParam - дополнительная информация о сообщении.

В Windows существует более тысячи стандартных сообщений. Для обработки стандартных сообщений существует функция DefWindowProc(), которая обрабатывает переданное ей сообщение по умолчанию. Таким образом, вы должны обрабатывать только те сообщения, обработка по умолчанию которых вас не устраивает.  

 LRESULT DefWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

 

Синхронные и асинхронные сообщения, их передача и обработка

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

Асинхронныесообщения передаются непосредственно окну, когда Windows вызывает оконную процедуру. В результате оконная процедура получает все предназначенные для окна сообщения, как синхронные, так и асинхронные.

 Структура программ для Windows очень проста, поскольку у них имеется только одно центральное место обработки сообщений. Говорят, что синхронные сообщения помещаются в очередь сообщений, а асинхронные посылаются прямо в оконную процедуру.

Синхронными становятся сообщения, в основном, тогда, когда они являются результатом пользовательского ввода путем нажатия клавиш (например, WM_KEYDOWN и WM_KEYUP), это символы, введенные с клавиатуры (WM_CHAR), результат движения мыши (WM_MOUSEMOVE) и щелчков кнопки мыши (WM_LBOTTONDOWN).

Кроме этого синхронные сообщения включают в себя сообщение от таймера (WM_TIMER), сообщение о необходимости плановой перерисовки (WM_PAINT) и сообщение о выходе из программы (WM_QUIT).

Сообщения становятся асинхронными во всех остальных случаях. Часто асинхронные сообщения являются результатом синхронных. При передаче асинхронного сообщения в DefWindowProc из оконной процедуры, Windows часто обрабатывает сообщение, отправляя оконной процедуре другие асинхронные сообщения.

С позиции оконной процедуры, эти сообщения проходят через нее упорядочено или синхронно.

Часто асинхронные сообщения являются результатом вызова определенных функций Windows или непосредственным результатом вызова функции SendMessage.

 

Ввод данных с клавиатуры

Механизм сообщений клавиатуры

Windows предоставляет возможность аппаратно независимого ввода с клавиатуры. Для этого используется драйвер (keyboard device driver), который преобразует аппаратно-специфичные скан коды (scan codes) клавиатуры (keyboard) в общие для всех приложений виртуальные коды клавиш. Затем Windows посылает сообщения (messages) приложениям, ожидающим ввод с клавиатуры, в итоге их обработка завершается в оконной процедуре (window procedure), наряду с другими сообщениями. Использование виртуальных кодов клавиш позволяет унифицировать обработку событий клавиатуры для приложений, запускаемых на различных компьютерах.

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

BOOL TranslateMessage(

CONST MSG *lpMsg

);

Она преобразовывает сообщение о нажатии клавиши в сообщение о приходе символа. Дело в том, что сообщения, генерируемые драйвером клавиатуры, содержат виртуальный key-code, который определяет, какая клавиша была нажата, но не определяет символьное значение этой клавиши. Функция TranslateMessage, не изменяя переданное ей сообщение, помещает еще одно сообщение с соответствующим символьным значением в очередь приложения. Функция возвращает True, если переданное ей сообщение оказалось клавиатурным.

После трансляции сообщение диспетчируется оконной процедуре:

LONG DispatchMessage(

CONST MSG *lpmsg

);

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

В Windows окно, имеющее фокус ввода, при нажатии на клавишу получает сообщение WM_KEYDOWN. При отпускании нажатой клавиши приходит сообщение WM_KEYUP. Эти сообщения (наряду с WM_SYSKEYDOWN и WM_SYSKEYUP) называются сообщениями нажатия клавиш (keystroke messages). При появлении любого из этих сообщения wParam содержит виртуальный код клавиши, а lParam – дополнительную информацию о состоянии клавиатуры, такую как количество повторений клавиши (repeat count), скан код (scan code), флаг расширенной клавиши (extended-key flag), признак нажатой клавиши Alt (context code), признак нажатия клавиши до прихода текущего сообщения (Previous Key-State Flag), признак положения клавиши “нажата” (Transition-State Flag).

 


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

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






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