Лекция 4 Мышь и таймер
Общие сведения
Мышь – это графическое устройство ввода информации с одной или более кнопками. Windows поддерживает однокнопочную, двухкнопочную или трехкнопочную мышь. Фактически стандартом, используемым большинством приложений Windows, стала двухкнопочная мышь. Программа может определить наличие мыши и количество кнопок мыши с помощью системных установок:
bool fMouse = GetSystemMetrics(SM_MOUSEPRESENT);
int cButtons = GetSystemMetrics(SM_CMOUSEBUTTONS);
Если мышь установлена, fMouse будет установлена в TRUE, количество кнопок при этом будет равняться cButtons.
Когда пользователь перемещает мышь, операционная система перемещает по экрану растровую картинку (обычно стрелку), которая называется "курсор мыши" (mouse cursor). Курсор мыши имеет "вершину" картинки (hot spot), размером в один пиксель, определяющую положение мыши на экране.
Ранее, при регистрации класса окна, мы уже сталкивались с необходимостью выбора типа курсора мыши, который устанавливается в приложении по умолчанию (см. тему "Регистрация окна"):
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
Тип IDC_ARROW является наиболее часто используемым курсором, представляющим собой стрелку, и имеющим вершину в левой верхней части. Приведем несколько примеров предопределенного курсора мыши:
IDC_APPSTARTING Стандартная стрелка с песочными часами
IDC_ARROW Стандартная стрелка
IDC_CROSS Крест
IDC_IBEAM Текстовый курсор (в виде символа I)
IDC_ICON Пустая иконка для Windows NT
IDC_NO Перечеркнутая окружность
IDC_SIZE Четыренаправленная стрелка для Windows NT
IDC_SIZENESW
IDC_SIZENS Различные стрелки изменения размера
IDC_SIZENWSE
IDC_SIZEWE
IDC_UPARROW
IDC_WAIT Песочные часы ожидания
Сообщения мыши
В отличие от клавиатуры, сообщения от мыши приходят в окно в любом случае, если мышь находится над окном (даже, если окно не активно и не имеет фокуса ввода) и совершается какое-либо действие с мышью (перемещение мыши или нажатие клавиш). В следующей таблице приведены основные сообщения от мыши, которые могут быть обработаны оконной процедурой:
Сообщение |
Назначение |
Значение параметра 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. Функции преобразуют координаты и записывают новые их значения на место старых.