Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
System programming / Конспект лекций / Лекция 4 Мышь.doc
Скачиваний:
54
Добавлен:
08.05.2015
Размер:
46.59 Кб
Скачать

Лекция 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. Функции преобразуют координаты и записывают новые их значения на место старых.