Опубликован: 17.08.2010 | Доступ: свободный | Студентов: 1000 / 59 | Оценка: 4.11 / 3.89 | Длительность: 29:38:00
Самостоятельная работа 4:

Программирование мыши и клавиатуры MFC

Аннотация: События мыши. Рисование с помощью мыши "точка за точкой". Рисование с помощью мыши "линия за линией". Перехват событий клавиатуры для изменения формы курсора. Фиксация формы курсора.
Файлы к данной лабораторной работе, Вы можете скачать здесь.

Часто в приложениях нужно определить, какая кнопка мыши была нажата, где была нажата, как долго удерживалась, когда и где была отпущена.

Цель работы - изучить:

  1. Какие события мыши существуют и как выбрать событие, удовлетворяющее нуждам данного приложения
  2. Как в приложениях, написанных на Visual C++, отслеживать события мыши и регировать на них
  3. Какие события клавиатуры существуют и какое действие инициирует каждое событие
  4. Как перехватывать сообщения клавиатуры и, в зависимости от произошедшего события, выполнять определенные действия

События мыши

Операционная система 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 как указано в таблице, остальные настройки в указанных вкладках должны быть сброшены. В неуказанных вкладках оставьте настройки по умолчанию.
    Таблица настройки мастера создания каркаса приложения
    Свойство проекта Значение
    Вкладка Application Type
    Application Type Dialog Based
    Resource language: Английский (США)
    Project style: MFC standard
    Use of MFC: Use MFC in a shared DLL
    Вкладка Advanced Features
    Все сбросить!
    Вкладка User Interface Features
    Main frame styles: System menu
    About box
    Dialog title: Mouse and Keyboard
  • Русифицируйте ресурсы узлов 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 на само диалоговое окно и областью рисования будет считаться клиентская область этого диалогового окна.

    В коде применяются маски выделения флага о состоянии кнопок мыши и управляющих клавиш. Выделение происходит с помощью побитовой операции умножения.

    Маски выделения состояний кнопок и клавиш
    Маска Описание
    MK_CONTROL Нажата клавиша CTRL
    MK_LBUTTON Нажата левая кнопка мыши
    MK_MBUTTON Нажата средняя кнопка мыши (в случае трехкнопочной мыши)
    MK_RBUTTON Нажата правая кнопка мыши
    MK_SHIFT Нажата клавиша SHIFT
  • Постройте и выполните проект

Обратите внимание, что при быстром движении мыши линия рисования имеет разрывы. Дело в том, что при выполнении функции OnMouseMove() параметр point показывает координаты курсора мыши во время последней проверки местоположения, а сама функция выполняется не непрерывно, а по квантам времени. Между этими квантами процессор выполняет другие задачи.

Александр Даниленко
Александр Даниленко
Стоит Windows 8 Pro, Visual Studio 2010 Express Edition .