«

»

Visual C++. MFC. Работа с мышью

Мышь используется преимущественно в тех приложениях, которые предназначены для рисования, например Paint или CorelDRAW. Сделаем подобное, но только более примитивное приложение, в котором пользователь сможет рисовать линии заданного цвета и размера. Использовать будем, также как и в прошлых уроках Visual C++ и библиотеку классов MFC.

Не буду подробно расписывать план создания каркаса приложения, так как Вы знаете шаги этой процедуры из первого урока.

  • создаем «Приложение MFC» с названием Pencil;
  • во вкладке «Тип приложения» укажите «На основе диалоговых окон» и уберите галку с «Использовать библиотеки с поддержкой Юникода»;
  • в следующей вкладке выберете название своего диалогового окна (у меня «Pencil programm»). Остальное оставьте без изменений.

Теперь поместите в окно элементы Static Text и Button, так как это показано на рисунке.

 

Щелкни для увеличения

 

В свойствах объекта Static Text укажите ID «IDC_INSTRUCTION_STATIC», а у Button «IDC_EXIT_BUTTON». Можете, также изменить границы у Static Text, что необязательно.

Щелкните два раза по кнопке «Выход», добавьте функцию OnOK(); в тело функции OnBnClickedExitButton(). Это необходимо для того, чтобы кнопка работала в соответствии с надписью на ней.

Зайдите в «Мастер классов», для этого пройдите «Проект->Мастер классов…». Появится окно под названием «Мастер классов MFC». В «Имя класса» укажите C(ваше название)Dlg, а во вкладке «Сообщения» выделите WM_MOUSEMOVE и щелкните по нему два раза левой кнопкой мыши. В поле «Существующие обработчики» появится функция OnMouseMove(рис. ниже), выделите ее и нажмите «Изменить код».

 

Мастер классов MFC

Щелкни для увеличения

 

В открывшемся окне измените тело функции OnMouseMove на следующий текст и сохраните все изменения.

 

1
2
3
4
5
6
7
8
9
void CPencilDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if( (nFlags & MK_LBUTTON)==MK_LBUTTON )
{
CClientDC dc(this);
dc.SetPixel(point.x, point.y, RGB(0,0,255));
}
CDialogEx::OnMouseMove(nFlags, point); //присутствует по умолчанию
}

 

  • оператор if проверяет, зажата и перемещается ли левая кнопка мыши, если да то выводиться точка за точкой;
  • dc(this) — экземпляр класса CClientDC, с помощью экземпляра класса вы можете обращаться к функциям этого класса.
  • dc.SetPixel(); — рисует точки, координаты которых ему передают операторы point.x и point.y, а RGB() задает цвет.

Запустив программу, можно имитировать ручку или карандаш указателем мыши.

 

Приложение MFC

Щелкни для увеличения

Во всяком случае, надпись или картинка нарисованная таким способом выглядит не слишком привлекательно. Поэтому сделаем линии непрерывными (соединим точки). Для этого нам необходимо следующее:

  1. Объявим целочисленные переменные  m_PointX и m_PointY для хранения предыдущих координат мыши.
    Воспользовавшись обозревателем решений, откроем файл PencilDlg.h. Впишем следующий код.

    1
    2
    3
    4
    5
    6
    7
    8
    class CPencilDlg : public CDialogEx
    {
    // Создание
    public:
    CPencilDlg(CWnd* pParent = NULL);// стандартный конструктор (присутствует по умолчанию)
    int m_PointX; //добавляем
    int m_PointY; //добавляем
    };
  2. Изменим код функции OnMouseMove в файле PencilDlg.cpp:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void CPencilDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if((nFlags & MK_LBUTTON)==MK_LBUTTON)
{
CClientDC dc(this);
CPen NewPen(PS_SOLID, 5, RGB(0,0,255));
dc.SelectObject(&NewPen);
dc.MoveTo(m_PointX, m_PointY);
dc.LineTo(point.x, point.y);
m_PointX=point.x;
m_PointY=point.y;
}
CDialogEx::OnMouseMove(nFlags, point); //присутствует по умолчанию
}

 

  • Функция CPen NewPen(PS_SOLID, 5, RGB(0,0,255)); создает новое перо синего цвета и размером шрифта в 5 пикселей. Параметр PS_SOLID указывает на рисование сплошной линии;
  • В SelectObject передается адрес нового пера, после чего оно включается в работу;
  • dc.MoveTo(m_PointX, m_PointY) и dc.LineTo(point.x, point.y) рисуют линию, используя координаты начала и конца;
  • Последние два оператора сохраняют в переменных m_PointX и m_PointY текущие координаты;

Если Вы уже запустили программу и попробовали ей воспользоваться, то думаю, заметили, что при первом нажатие, линия вылезает из пределов экрана. Это происходит из-за того, что начальные координаты не определены, а известны только текущие. Исправим это! Зайдем в «Мастер классов», во вкладке сообщений найдем WM_LBUTTONDOWN, и выделив его, щелкнем по «Добавить обработчик…». В окне существующие обработчики появится «OnLButtonDown» (рис. ниже).

MFC Class Wizard

Щелкни для увеличения

 

Изменим тело этой функции:

 

1
2
3
4
5
6
void CPencilDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
m_PointX=point.x;
m_PointY=point.y;
CDialogEx::OnLButtonDown(nFlags, point);
}

 

Только что мы обновили значения переменных m_PointX и m_PointY тем местоположением, где было совершено нажатие левой кнопки мыши. Теперь ваша программа будет работать не хуже графических редакторов 80-ых годов)) Файлы исходного кода доступны для скачивания по этой ссылке.

2 комментария

  1. lKaSTieL

    Здравствуйте, не могу найти файл PointDlg.h(скорее всего его вообще нет), использую Visual Studio 2012. До этого программа работает.

    1. А. С. Третьяков

      Здравствуйте. В уроке была допущена опечатка. Нужно открыть файл PencilDlg.h. Опечатка исправлена) Спасибо!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Вы можете использовать эти теги HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Проверка на человечность *