В отличие от клавиатуры, сообщения от мыши приходят в окно в любом случае, если мышь находится над окном (даже, если окно не активно и не имеет фокуса ввода) и совершается какое-либо действие с мышью (перемещение мыши или нажатие клавиш). В следующей таблице приведены основные сообщения от мыши, которые могут быть обработаны оконной процедурой:
Сообщение | Назначение | Значение параметра lParam | Значение параметра wParam |
WM_MOUSEMOVE | Мышка перемещается над окном | Координаты мыши в координатах клиентской области окна: x= LOWORD(lParam) y= HIWORD(lParam) | Битовая маска, определяющая состояние управляющих клавиш и других кнопок мыши: MK_LBUTTОN левая кнопка нажата MK_RBUTTОN правая кнопка нажата MK_МBUTTUN средняя кнопка нажата MK_SHIFT <Shift> нажат MK_CONTROL <Ctrl> нажат |
WM_LBUTTONDOWN | Левая клавиша нажата | ||
WM_MBUTTONDOWN | Средняя клавиша нажата | ||
WM_RBUTTONDOWN | Правая клавиша нажата | ||
WM_LBUTTONUP | Левая клавиша отпущена | ||
WM_MBUTTONUP | Средняя клавиша отпущена | ||
WM_RBUTTONUP | Правая клавиша отпущена | ||
WM_LBUTTONDBLCLK | Левая клавиша дважды нажата | ||
WM_MBUTTONDBLCLK | Средняя клавиша дважды нажата | ||
WM_RBUTTONDBLCLK | Правая клавиша дважды нажата |
Следует заметить, что окно состоит из двух частей – клиентской области (куда непосредственно осуществляется графический вывод оконной процедуры) и не клиентской области, которую занимает все оставшееся пространство окна (рамка, строка заголовка, меню). Сообщение от мыши приходит в оконную процедуру при попадании в любую область окна – клиентскую и не клиентскую. Тип сообщений в обоих случаях разный. Каждому сообщению в таблице, приведенной выше, соответствует сообщение не клиентской области имеющее префикс NC (nonclient). Например, WM_NCLBUTTONDOWN, WM_NCLBUTTONUP. Значения остальных параметров для не клиентской области отличаются: wParam показывает зону нерабочей области, в которой произошло перемещение или щелчок мыши (что можно определить при помощи идентификаторов, начинающихся с HT(hit-test) и определенных в заголовочных файлах Windows); параметр lParam содержит координаты мыши относительно экрана.
|
|
Существуют две функции, позволяющие перевести оконные координаты в координаты экрана и наоборот:
ScreenToClient(hwnd, pPoint); // преобразует экранные координаты в оконные
ClientToScreen(hwnd, pPoint); // преобразует оконные координаты в экранные
В функции передаются координаты через структуру POINT. Функции преобразуют координаты и записывают новые их значения на место старых.