Сообщения (часть 2)


Каждое сообщение Windows имеет свой уникальный номер (идентификатор), а оконная процедура целиком состоит из оператора case, и каждому сообщению соответствует своя альтернатива этого оператора.

Уникальные номера сообщений и их константы можно найти в модуле Messages.pas. Представленные там константы начинаются с префикса, указывающего на принадлежность сообщения к определенной группе. Например, сообщения общего назначения начинаются с WM_: например, WM_Paint, WM_GetTextLength, а сообщения для кнопок начинаются с префикса BM_.

Помимо уникального идентификатора каждое сообщение содержит два параметра: WParam И LParam.

Буквы w и l ("Word" и "Long") означают: первый параметр 16-разрядный, а второй — 32-разрядный.

Однако так было только в старых, 16-разрядных версиях Windows. В 32-разрядных версиях оба параметра 32-разрядные, несмотря на их названия.

Конкретный смысл каждого параметра зависит от сообщения, В некоторых сообщениях один или оба параметра могут вообще не использоваться, в других, наоборот, двух параметров не хватает. В этом случае один из параметров (обычно LParam) содержит указатель на дополнительные данные.

Кроме параметров WParam и LParam, каждому сообщению приписывается время возникновения и координаты курсора в момент возникновения. Эти параметры можно узнать С помощью функций GetMessageTime и GetMessagePos соответственно.

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

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

На практике обычно все эти сложности не требуются, зачастую нужно лишь написать обработчик на какое-либо нестандартное сообщение.

 


Читайте также

Дескрипторы

Когда мы создаем некоторый объект в Windows, ему присваивается уникальный 32-разрядный…

Сообщения (часть 1)

Сообщения операционной системы Windows очень напоминают событийные сообщения Delphi...

Сообщения (часть 3)

(ниже представлена обработка сообщения wm_move...

Сообщения (часть 4)

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

Синтаксис функций Windows API

Большая часть функций API уже импортирована в среду Delphi и описана в ее модулях



Комментарии (0)







Разрешённые теги: <b><i><br>Добавить новый комментарий: