Стоит Windows 8 Pro, Visual Studio 2010 Express Edition . |
Программирование мыши и клавиатуры MFC
Часто в приложениях нужно определить, какая кнопка мыши была нажата, где была нажата, как долго удерживалась, когда и где была отпущена.
Цель работы - изучить:
- Какие события мыши существуют и как выбрать событие, удовлетворяющее нуждам данного приложения
- Как в приложениях, написанных на Visual C++, отслеживать события мыши и регировать на них
- Какие события клавиатуры существуют и какое действие инициирует каждое событие
- Как перехватывать сообщения клавиатуры и, в зависимости от произошедшего события, выполнять определенные действия
События мыши
Операционная система Windows генерирует достаточное количество сообщений о событиях, связанных с мышью, чтобы строить гибкие приложения, позволяющие решать практически любые задачи. Если выделить диалоговую форму и во вкладке Properties (Свойства) щелкнуть по кнопке Messages (Сообщения), то в прокручивающемся списке можно обнаружить следующие сообщения для мыши
Сообщения о событиях мыши | |
---|---|
Сообщение | Описание |
WM_LBUTTONDOWN | Левая кнопка мыши нажата |
WM_LBUTTONUP | Левая кнопка мыши отпущена |
WM_LBUTTONDBLCLK | Двойной щелчок левой кнопкой мыши |
WM_RBUTTONDOWN | Правая кнопка мыши нажата |
WM_RBUTTONUP | Правая кнопка мыши отпущена |
WM_RBUTTONDBLCLK | Двойной щелчок правой кнопкой мыши |
WM_MBUTTONDOWN | Средняя кнопка мыши нажата (в случае трехкнопочной мыши) |
WM_MBUTTONUP | Средняя кнопка мыши отпущена (в случае трехкнопочной мыши) |
WM_MBUTTONDBLCLK | Двойной щелчок средней кнопкой мыши (в случае трехкнопочной мыши) |
WM_MOUSEMOVE | Перемещение указателя мыши в окне приложения |
WM_MOUSEWHEEL | Колесо мыши прокручивается |
Рисование с помощью мыши "точка за точкой"
-
Создайте новый проект с именем Mouse. Для этого выберите настройки мастера MFC Application Wizard как указано в таблице, остальные настройки в указанных вкладках должны быть сброшены. В неуказанных вкладках оставьте настройки по умолчанию.
- Русифицируйте ресурсы узлов Dialog и String Table через панель Resource View
-
Раскройте ресурс IDD_MOUSE_DIALOG. Через меню Edit/Select All выделите и удалите все элементы управления из диалогового окна приложения
Тем самым вся поверхность окна будет отведена для рисования. Если этого на сделать, то любому из оставшихся элементов управления, получившему фокус ввода, диалоговое окно будет передавать события клавиатуры как своему дочернему окну.
-
Выделите диалоговое окно приложения и во вкладке Properties щелкните по кнопке Messages. В открывшейся вкладке сообщений найдите сообщение WM_MOUSEMOVE и обработайте ее следующим кодом
Обработчик сообщения WM_MOUSEMOVE файла MouseDlg.cpp void CMouseDlg::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default // Что сделать: Добавьте свой код обработчика сообщения // и/или вызовите заданный по умолчанию // Выяснить, нажата ли левая кнопка мыши if((nFlags & MK_LBUTTON) == MK_LBUTTON){ // Создать объект контекста устройства CClientDC dc(this); // Нарисовать точку в текущей позиции курсора dc.SetPixel(point.x, point.y, RGB(0, 0, 0)); } CDialog::OnMouseMove(nFlags, point); }
Контекст устройства - это некий логический экран, обеспечивающий согласованною связь с драйверами конкретных устройств вывода: физического экрана или принтера. Контекст устройства как класс имеет необходимые методы и свойства для рисования. Конструктору этого класса при создании объекта контекста устройства передается указатель this на само диалоговое окно и областью рисования будет считаться клиентская область этого диалогового окна.
В коде применяются маски выделения флага о состоянии кнопок мыши и управляющих клавиш. Выделение происходит с помощью побитовой операции умножения.
- Постройте и выполните проект
Обратите внимание, что при быстром движении мыши линия рисования имеет разрывы. Дело в том, что при выполнении функции OnMouseMove() параметр point показывает координаты курсора мыши во время последней проверки местоположения, а сама функция выполняется не непрерывно, а по квантам времени. Между этими квантами процессор выполняет другие задачи.