Реагирование на щелчки мыши
Если пользователь нажимает кнопку мыши, пока курсор находится в клиентской области окна, окно получает одно из следующих сообщений.
Сообщение | Значение |
---|---|
WM_LBUTTONDOWN | Левая кнопка вниз |
WM_LBUTTONUP | Левая кнопка вверх |
WM_MBUTTONDOWN | Кнопка "Средний" вниз |
WM_MBUTTONUP | Кнопка "Средний" вверх |
WM_RBUTTONDOWN | Кнопка справа вниз |
WM_RBUTTONUP | Правая кнопка вверх |
WM_XBUTTONDOWN | XBUTTON1 или XBUTTON2 вниз |
WM_XBUTTONUP | XBUTTON1 или XBUTTON2 вверх |
Помните, что клиентская область является частью окна, которое исключает кадр. Дополнительные сведения о клиентских областях см. в разделе "Что такое окно"?
Координаты мыши
Во всех этих сообщениях параметр lParam содержит координаты x-и y указателя мыши. Самый низкий 16 бит lParam содержит координату x, а следующие 16 битов содержат координату y. Используйте макросы GET_X_LPARAM и GET_Y_LPARAM для распаковки координат из lParam.
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
Эти макросы определены в файле заголовка WindowsX.h.
В 64-разрядной версии Windows lParam имеет 64-разрядное значение. Верхние 32 бита lParam не используются. Где в документации По Windows упоминается слово с низким порядком и "слово с высоким порядком" lParam, 64-разрядная буква означает низкий и высокий порядок слов нижнего 32 бита. Макросы извлекают правильные значения, поэтому при их использовании вы будете безопасны.
Координаты мыши задаются в пикселях, а не на устройствах (DIPs) и измеряются относительно клиентской области окна. Координаты — это подписанные значения. Позиции выше и слева от клиентской области имеют отрицательные координаты, что важно, если отслеживать положение мыши за пределами окна. Мы посмотрим, как это сделать в следующем разделе, захват перемещения мыши за пределами окна.
Дополнительные флаги
Параметр wParam содержит побитовое ЗНАЧЕНИЕ ИЛИ флагов, указывающее состояние других кнопок мыши, а также клавиш SHIFT и CTRL.
Флаг | Значение |
---|---|
MK_CONTROL | Клавиша CTRL вниз. |
MK_LBUTTON | Левая кнопка мыши вниз. |
MK_MBUTTON | Средняя кнопка мыши вниз. |
MK_RBUTTON | Правая кнопка мыши вниз. |
MK_SHIFT | Клавиша SHIFT вниз. |
MK_XBUTTON1 | Кнопка XBUTTON1 вниз. |
MK_XBUTTON2 | Кнопка XBUTTON2 вниз. |
Отсутствие флага означает, что соответствующая кнопка или клавиша не нажата. Например, чтобы проверить, не работает ли клавиша CTRL:
if (wParam & MK_CONTROL) { ...
Если вам нужно найти состояние других клавиш, кроме КЛАВИШ CTRL и SHIFT, используйте функцию GetKeyState, которая описана в разделе "Ввод клавиатуры".
Сообщения окна WM_XBUTTONDOWN и WM_XBUTTONUP применяются как к XBUTTON1, так и к XBUTTON2. Параметр wParam указывает, какая кнопка была нажата.
UINT button = GET_XBUTTON_WPARAM(wParam);
if (button == XBUTTON1)
{
// XBUTTON1 was clicked.
}
else if (button == XBUTTON2)
{
// XBUTTON2 was clicked.
}
Двойные щелчки
Окно по умолчанию не получает уведомления с двойным щелчком мыши. Чтобы получить двойные щелчки, задайте флаг CS_DBLCLKS в структуре WNDCLASS при регистрации класса окна.
WNDCLASS wc = { };
wc.style = CS_DBLCLKS;
/* Set other structure members. */
RegisterClass(&wc);
Если вы задали флаг CS_DBLCLKS , как показано ниже, окно получит уведомления с двойным щелчком мыши. Двойной щелчок указывается сообщением окна с именем DBLCLK. Например, дважды щелкните левую кнопку мыши, создав следующую последовательность сообщений:
В действительности второй WM_LBUTTONDOWN сообщение, которое обычно создается, становится WM_LBUTTONDBLCLK сообщением. Эквивалентные сообщения определяются для кнопок справа, середины и XBUTTON.
Пока вы не получите сообщение двойного щелчка, нет способа сказать, что первый щелчк мыши является началом двойного щелчка. Поэтому действие двойного щелчка должно продолжать действие, начинающееся с первого щелчка мыши. Например, в оболочке Windows один щелчок выбирает папку, а дважды щелкните папку.
Сообщения, отличные от клиента,
Отдельный набор сообщений определяется для событий мыши, происходящих в не клиентской области окна. Эти сообщения имеют буквы "NC" в имени. Например, WM_NCLBUTTONDOWN является эквивалентом WM_LBUTTONDOWN не клиента. Обычное приложение не перехватывает эти сообщения, так как функция DefWindowProc правильно обрабатывает эти сообщения. Однако они могут быть полезны для некоторых расширенных функций. Например, эти сообщения можно использовать для реализации пользовательского поведения в строке заголовка. Если вы выполняете обработку этих сообщений, их следует передать в DefWindowProc после этого. В противном случае приложение разорвит стандартные функциональные возможности, такие как перетаскивание или минимизация окна.
Следующий