Л.р№6x

advertisement
ЛАБОРАТОРНАЯ РАБОТА 6
Тема: Рисование с помощью мыши.
1.
Цель работы: Освоить события визуальных компонентов для управления мышью. Создание
приложения, позволяющее рисовать на форме с помощью мыши. При нажатии левой кнопки мыши и её
перемещении отображается кривая движения указателя мыши. При двойном щелчке рисунок стирается.
Необходимая информация:
Для выполнения какого-либо действия с помощью щелчка левой кнопки мыши для большинства случаев
достаточно запрограммировать обработчик событий Click. Для реакции на двойной щелчок используется
событие DoubleClick. Для более совершенного управления мышью лучше использовать обработчики
следующих событий:



MouseDown. Вызывается при нажатии любой кнопки мыши.
MouseMove. Вызывается при перемещении мыши.
MouseUp. Вызывается при отпускании какой-нибудь кнопки мыши.
Функции обработки этих событий получают следующие параметры:
(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)



sender. Представляет объект, который получил это событие (на каком объекте щелкнули мышью).
e->Button. Имеет одно из трех значений: Right, Left, Middle. Используется для определения того, какую
кнопку мыши нажал пользователь.
e->X, e->Y. Координаты указателя мыши в пикселях относительно клиентской области окна с
координатами (0,0) в верхнем левом углу.
Выполнение работы:
1. Установите размер формы: ширина 800, высота 600. Цвет формы установите White. Курсор установите
Hand. В нижней части формы поместите четыре компонента Label для отображения координат
указателя мыши по X и по Y (впоследствии при перемещении мыши значения координат будут
изменяться в соответствии с движением мыши).
2. В модуле формы в разделе private опишите переменную Dragging типа bool. Данная переменная будет
указывать на то, в каком режиме находится мышь. Для этого в программе позже вы будете присваивать
ей значение true, если мышь находится в режиме рисования либо false, если мышь находится в
обычном режиме. Изначально нужно установить ее значение в false, так как при запуске программы
мышь находится в обычном режиме. Сделайте это в обработчике события Activate формы.
3. В процедуре обработки события MouseDown формы в случае нажатия левой кнопки установите режим
рисования (переменная Dragging):
if (e->Button == System::Windows::Forms::MouseButtons::Left) Dragging=true;
Затем отобразите текущие координаты указателя мыши на форме. Программа должна работать так:
При щелчке мыши будут выводиться координаты по X и по Y.
4. В процедуре обработки события MouseMove, если установлен режим рисования (постройте условие),
также выводите значения координат на форму. В этой же процедуре будет происходить
непосредственно рисование:
Для начала необходимо создать дескриптор (это будет переменная formGraph), который будет хранить
адрес объекта типа Graphics (класс для работы с графикой):
Graphics^ formGraph; // описываем дескриптор там же, где и описали переменную Dragging.
Затем, найдите код конструктора формы и добавьте инициализацию данного дескриптора:
Теперь вернемся к нашему обработчику события MouseMove, в котором теперь можно вызвать любой
метод для рисования, используя ранее объявленный дескриптор formGraph. Обратите внимание, что все
действия в данном обработчике должны выполняться только если установлен режим рисования.
Например, можно вызвать метод FillRectangle(),который позволяет рисовать прямоугольники
разного размера и цвета. Будем рисовать черные прямоугольники шириной 3 пикселя и высотой 5 пикселей
(они будут образовывать линию рисования, как в стандартной программе Paint):
formGraph->FillRectangle( Brushes::Black, e->X, e->Y, 3, 5);
Цвет, координаты, ширина и высота являются параметрами метода FillRectangle(). А этот метод,
в свою очередь, вызывается из formGraph, то есть из заданного нами дескриптора, который хранит адрес
объекта типа Graphics.
5. Запустите программу и посмотрите, что происходит, когда вы нажимаете левую кнопку мыши и
перемещаете указатель. Обратите внимание, что рисование не прекращается. Поменяйте цвет рисования
и покажите результат преподавателю.
6. Чтобы рисование прекращалось, когда вы отпускаете кнопку мыши, необходимо в процедуру обработки
события MouseUp формы добавить отмену использования мыши для рисования. За включение и
выключение режима рисования у вас в программе отвечает переменная Dragging. Добавьте
необходимый оператор в обработчик события MouseUp формы.
7. Теперь нужно запрограммировать стирание рисунка по двойному щелчку мыши. Для этого создайте
соответствующий обработчик события MouseDoubleClick для формы и добавьте в него вызов функции
Refresh();
6. Запрограммируйте «стирательную резинку» в обработчике события MouseMove: при нажатии правой
кнопки мыши должно происходить «рисование» цветом фона формы, тем самым, стирая рисунок. Для
этого, сформируйте условие нажатия правой кнопки мыши аналогично тому, что было в пункте 3.
(Переменную Dragging проверять в этом случае не нужно.) Величина резинки определяется толщиной
линии, которую вы можете задать любой, а цвет установите White, так как этот цвет вы задали цветом
фона формы.
8. Теперь сделаем так, чтобы во время работы программы можно было менять толщину линии, то есть
ширину и высоту прямоугольников. Для этого поместите на форму два элемента numericUpDown. Этот
элемент позволит менять цифровые значения, которые вы можете отправлять в метод
FillRectangle() (с помощью которого рисуете на форме). У элемента numericUpDown
посмотрите свойство Value. Как раз в нем будет храниться текущее значение, которые вы зададите во
время выполнения программы в любой момент времени.
Чтобы рисование происходило с учетом этих значений, нужно вместо обычных цифр, указывающих
ширину
и
высоту,
поставить
значения
из
двух
элементов
numericUpDown:
Convert::ToInt32(numericUpDown1->Value) и Convert::ToInt32(numericUpDown2->Value) в методе
рисования. Не смотря на то, что здесь мы работаем только с целыми числами, преобразование
Convert::ToInt32 здесь необходимо, так как значение Value имеет особый системный тип, а не просто
int.
Контрольные вопросы
1. Какие события и как используются в управлении мышью?
2. Для чего в данной программе использовалась переменная Dragging, по
какому алгоритму менялось ее значение?
3. Как работает метод FillRectangle(), какие у него параметры?
4. Как была реализована «стирательная резинка» в программе?
5. Поясните использование элемента numericUpDown в программе.
Download