Практическая работа №2. Создание Windows-окна и обработчиков событий.
Задачи:
1. Создать форму Form1, определить динамически её параметры (размер, положение при запуске, минимальный и максимальный размер, и др.).
2. Добавить динамически кнопки управления: «Точки», «Параметры», «Кривая», «Ломаная», «Бейзеры», «Заполненная», «Движение», «Очистить».
3. Создать обработчики нажатия кнопок формы:
Кнопка формы |
Функциональность |
Точки |
Нажатие кнопки включает, либо выключает режим добавления точек по щелчку мыши. |
Параметры |
Вызывается дочернее окно, позволяющее установить параметры графических объектов (толщина линий, размер точек, цвет точек и линий, характер движения: случайный или с сохранением фигуры, и др.) |
Кривая |
По отмеченным точкам строится замкнутая кривая (DrawClosedCurve) |
Ломанная |
По отмеченным точкам строится многоугольник (DrawPolygone) |
Бейзеры |
По отмеченным точкам строятся кривые Бейзера (DrawBeizers). Обратите внимание, что кривые Бейзера строятся только при определенном числе точек. |
Заполненная |
По отмеченным точкам строится заполненная кривая (FillCurve) |
Движение |
Нажатие кнопки включает, либо выключает режим движения. В режиме движения точки и построенная по точкам фигура начинают двигаться в случайном направлении. Возможны два режима движения: случайный – каждая точка двигается со случайной скоростью и направлением; «сохраняющий» – все точки двигаются в одном направлении и с одинаковой скоростью. При достижении границы формы точки отражаются. |
Очистить |
Очищение формы. |
Предусмотрите включение/выключение определенных режимов при нажатии кнопок формы. Например, нажатие кнопки «Точки» выключает режим движения, если он включен, и очищает экран. Нажатие кнопки «Кривая» выключает режим «Точки» и т.п.
4. Создать обработчики нажатия клавиш:
Кнопка |
Функционал |
Space |
Включает/выключает режим движения. |
+ |
Увеличивает скорость движения точек |
- |
Уменьшает скорость движения точек |
Escape |
Очищает содержимое формы |
5. Создайте обработчик событий мышки, обеспечивающий возможность перетаскивания отдельных точек.
6. Добавьте обработчики нажатия клавиш:
Кнопка |
Функциональность |
Стрелки ↑ , ↓, →, ← |
При выключенном режиме движения – перемещает фигуру в соответствующем направлении. При включенном режиме движения – увеличивает скорость в соответствующем направлении. |
Дополнительные задания
· Реализуйте возможность добавления новых фигур и механизм их совместного поведения при движении.
Рекомендации к выполнению работы
Для отображения графических объектов в форме необходимо получить объект типа Graphics, который инкапсулирует поверхность для рисования, связанную с элементом управления. Доступ к объекту Graphics можно получить в обработчике события Paint:
// Конструктор формы
public Form1()
{
..
Paint += new PaintEventHandler(Form1_Paint);
// Разрешается использовать сокращенную форму
// Paint += Form1_Paint;
}
// Обработчик события Paint
void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.FillClosedCurve(Brushes.ForestGreen, arPoints);
..
}
Рисование осуществляется с помощью методов, начинающихся с Fill.. или Draw.. . Методы первой группы отображают заполненные фигуры (эллипсы, многоугольники, кривые и т.д.) и используют графический объект «кисть» типа Brush. Класс Brushesпозволяет получить доступ к уже созданным объектам Brush по имени цвета кисти: Brushes.ForestGreen. Методы группы Draw.. отображают контуры фигур без заполнения и используют графический объект «перо» типа Pen. Получить уже созданное перо определенного цвета можно в классе Pens.
Для отображения фигур необходимо предоставить массив точек типа Point. Объект Point представляет собой структуру с полями x, y типа Int32. Для хранения точек можно использовать массив или список типа List<Point>. В первом случае необходимо правильно обрабатывать ситуацию добавления новых точек. Использование списка упрощает добавление новых точек, но не позволяет изменять координаты существующих точек – требуется создание нового объекта:
// arPoints – список типа List<Point>
arPoints[i] = new Point(_x, _y);
// arrP – массив точек типа Point[]
arrP[i].X = _x; arrP[i].Y = _y;
Для перерисовки фигур необходимо обновлять поверхность формы. Для обновления можно воспользоваться методом Refresh, либо методами Invalidate и Update.
Движение фигур реализуется как изменение координат точек и перерисовка формы. Для периодического изменения координат можно воспользоваться объектом типа Timer и событием Tick:
moveTimer.Interval = 30;
moveTimer.Tick += new EventHandler(TimerTickHandler);
Период возникновения события Tick задается свойством Interval в миллисекундах.
Для обработки нажатия клавиш можно реализовать обработчик события KeyDown. При этом необходимо установить свойство KeyPreview для предварительной обработки событий клавиатуры в форме, а не в элементах управления (активные кнопки формы):
KeyPreview = true;
KeyDown += new KeyEventHandler(Form1_KeyDown);
Обработчик KeyDown в параметре события типа KeyEventArgs содержит свойство KeyCode, которое возвращает код нажатой клавиши и используемые модификаторы (Shift, Alt, Ctrl) в объекте типа Keys. Класс Keys содержит статические члены, которые можно использовать для установления нажатой клавиши:
switch (e.KeyCode)
{
case(Keys.Add) :
..
break;
case(Keys.Space) :
..
break;
default:
break;
}
Перед выходом из обработчика необходимо установить флаг Handled аргумента KeyEventArgs, определяющий успешность обработки клавиши:
e.Handled = true;
Значение e.Handled = false приведет к последующей обработке клавиши дочерними элементами управления, например, кнопкой формы, находящейся в активном состоянии.
Обработка управляющих кнопок (стрелки) требует дополнительной перегрузки метода
protected override bool ProcessCmdKey(ref Message msg,
Keys keyData)
{
..
return base.ProcessCmdKey(ref msg, keyData);
}
Статус обработки (успешно или нет) определяется возвращаемым значением: true – клавиша обработана, нет необходимости в последующей обработке; false – клавиша не обработана, необходимо вызывать другие обработчики события KeyDown.
Для реализации режима перемещения точек с помощью мышки необходимо обрабатывать события:
MouseDown (нажатие кнопки мышки): если указатель мышки находится в окрестности какой-либо точки, то включить режим перемещения, т.е. установить флаг перемещения: bDrag = true и запомнить активную точку iPointToDrag.
MouseMove (движение мышки): если режим перемещения включен, то перемещать активную точку в соответствии с текущим положением указателя мышки.
MouseUp (отпускание кнопки мышки): снять режим перемещения.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.