В отличие от клавиатуры, сообщения от мыши приходят в окно в любом случае, если мышь находится над окном (даже, если окно не активно и не имеет фокуса ввода) и совершается какое-либо действие с мышью (перемещение мыши или нажатие клавиш). В следующей таблице приведены основные сообщения от мыши, которые могут быть обработаны оконной процедурой:
Сообщение
| Назначение
| Значение параметра 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. Функции преобразуют координаты и записывают новые их значения на место старых.