854 Часть V. Инструментарий программиста общений приложения посылается соответствующее сообщение (например,

WM_RBUTTUNDBLCLK ИЛИ ИМ_LBUTTONDBLCLK).

Параметр pt содержит координаты Х и Y курсора в момент отправки сообщения. Например, когда вы нажимаете в окне правую кнопку мыши, окну передается сообщение IVM_RBUTTONDOWN. В этом случае параметр pt содержит координаты Х и Y курсора мыши в момент нажатия кнопки.

Замечание

Позиция курсора в сообщении исчисляется в координатах экрана или текущего устройства. Преобразовать эти координаты в систему координат окна

МОЖНО С ПОМОЩЬЮ ФУНКЦИИ WindOWS API DPtoLP () .

Генерация и обработка сообщений

Операционная система Windows посылает каждому приложению сообщения обо всех относящихся к нему событиях. К этим событиям относятся, например, перемещение пользователем мыши, нажатие клавиши на клавиатуре, изменение размеров или перемещение окна, манипуляции с элементами управления в окне приложения.

Сгенерировав эти сообщения, Windows помещает их в ядро системы, в системную очередь сообщений (рис. 30.2). Ядро Windows затем извлекает каждое сообщение и пересылает его в очередь сообщений приложения в соответствии с содержащимся в сообщении дескриптором окна hwnu.

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

Очередь сообщений приложения, в которую Windows помешает сообщения, адресованные данному приложению, построена по схеме первый пришел — первый вышел (first in — first out, FIFO). Приложение в цикле поштучно выбирает сообщения из очереди, вызывая функцию GetMessageo, и отправляет каждое соответствующей процедуре окна с помощью функции

DispatchMessage().

?

Замечание

Из правила FIFO для очереди сообщений есть два исключения. Это сообщения WM_TIMER и WM_ PAINT. Эти сообщения находятся в очереди сообщений приложения до тех пор. пока приложение не обработает все остальные сообщения.