Поделиться через


Реагирование на щелчки мыши

Если пользователь нажимает кнопку мыши, пока курсор находится в клиентской области окна, окно получает одно из следующих сообщений.

Сообщение Значение
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_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP

В действительности второй WM_LBUTTONDOWN сообщение, которое обычно создается, становится WM_LBUTTONDBLCLK сообщением. Эквивалентные сообщения определяются для кнопок справа, середины и XBUTTON.

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

Сообщения, отличные от клиента,

Отдельный набор сообщений определяется для событий мыши, происходящих в не клиентской области окна. Эти сообщения имеют буквы "NC" в имени. Например, WM_NCLBUTTONDOWN является эквивалентом WM_LBUTTONDOWN не клиента. Обычное приложение не перехватывает эти сообщения, так как функция DefWindowProc правильно обрабатывает эти сообщения. Однако они могут быть полезны для некоторых расширенных функций. Например, эти сообщения можно использовать для реализации пользовательского поведения в строке заголовка. Если вы выполняете обработку этих сообщений, их следует передать в DefWindowProc после этого. В противном случае приложение разорвит стандартные функциональные возможности, такие как перетаскивание или минимизация окна.

Следующий

Перемещение мыши