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. Эти сообщения находятся в очереди сообщений приложения до тех пор. пока приложение не обработает все остальные сообщения.