![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Реализация второго способа несколько сложнее, чем первого, но зато более эффективная. Для этого необходимо несколько видоизменить функцию Form1_MouseDown и задействовать ещё одну функцию отклика формы на внешние события. А именно: на событие, связанное с перемещением "мыши" - Form1_MouseMove. С учётом сказанного и в соответствии с особенностями второго способа (см. раздел 2.1.2), необходимо разработать соответствующий программный текст его реализации, реагирующий на возникновение следующих событий:
При нажатии на клавишу мыши (например, на левую) необходимо выполнить следующие действия:
q При фиксации места для очередной вершины многоугольника необходимо создавать объект, сохраняющий её координаты, и добавлять его в список вершин.
q Если же фиксируется признак окончания формирования фигуры (например, нажатие на правую клавишу мыши), то необходимо сделать следующее:
· Дорисовать последнюю её грань в виде линии, соединяющей последнюю и первую вершины фигуры.
· Уничтожить все элементы списка, в которых хранятся координаты вершин многоугольника, и очистить сам список, тем самым подготовив его для формирования следующей фигуры.
В Листинге 3 представлена одна из возможных и наиболее простых реализаций соответствующей функции-обработчика этого события.
Листинг 3. Реализация функции Form1_MouseDown
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
Graphics g = CreateGraphics(); //Создаем объект Graphics
Pen pen= new Pen(Color.Black, 1);//Создаем объект "пера"
//Объявляем локальную переменную для хранения координат вершины
Point pnt;
switch (drMode)
{
case DrawMode.ByPoint://здеь располагается программный текст реагирования формы
// на событие нажатия на клавишу "мыши" в режиме "По-точкам"
// (См. листинг 2)
break;
case DrawMode.Ribbon:
if (e.Button == MouseButtons.Left)//Если нажата левая клавиша мыши
{
// Создаем объект вершины с координатами курсора
pnt = new Point(e.X, e.Y);
PointsList.Add(pnt); // Добавляем его в список вершин
}
else //Если нажата правая клавиша мыши
{
if (PointsList.Count > 0) //Если есть хотя бы одна вершина
{
Refresh();// Перерисовка формы с рисованием незамкнутой фигуры
//Соединяем первую вершину с последней
g.DrawLine(pen, PointsList[0], PointsList[PointsList.Count - 1])
// Очистка списка вершин с целью его подготовки к работе
PointsList.Clear();//со следующей фигурой
}
}
Break. Эта переменн
}
oldCursor.X = e.X;//Запоминаем горизонтальную
oldCursor.Y = e.Y;//и вертикальную координаты курсора
pen.Dispose(); //Освобождаем ресурсы пера
g.Dispose(); //Освобождаем ресурсы объекта Graphics
}
Примечание. Анализ процесса вырисовывания показывает, что когда завершается формирование контура фигуры, то нужно не только соединить линией первую и последнюю ее вершину, но и стереть линию "резинки", соединяющую последнюю вершину и курсор. А для этого нужно вызвать другую функцию, которая стирала бы всю клиентную область экрана и нарисовала замкнутый контур фигуры заново. Следует заметить, что у любой формы есть функция, которая стирает и перерисовывает область, которую она занимает. Она нужна для того, чтобы оперативно восстановить внешний вид формы после того, как его закроет другое окно, после его перемещения или после сворачивания в пиктограмму и т.д. Эта функция называется Paint. Непосредственное к ней обращение не рекомендуется. Но для того, чтобы все-таки к ней обратиться предусмотрено несколько вспомогательных функций: Invalidate(), Refresh() и Update().
В нашем случае используется функция Refresh (). Однако для того, чтобы это сработало, необходимо определить: что же должна делать (в нашем случае – рисовать) эта функция. Один из возможных вариантов ее программного текста представлен в листинге 5.
Листинг 5.
private void Form1_Paint(object sender, PaintEventArgs e)
{
Pen pen = new Pen(Color.Black, 1); //Создаем объект "пера"
Point[] points = new Point[PointsList.Count];// Объявляем и создаем массив вершин
points=PointsList.ToArray(); //Инициализируем массив элементами списка
if (PointsList.Count > 1) //Если в списке больше одной вершины, то…
{
e.Graphics.DrawLines(pen, points);//Рисуем незамкнутый контур фигуры
}
}
При перемещении курсора мыши необходимо выполнить следующие операции:
q Если список вершин - пустой, то ничего не рисовать.
q Если же в списке есть вершины, то вначале нужно стереть старую линию, соединяющую последнюю вершину формируемой грани фигуры (неподвижная точка) с точкой предыдущего местоположения курсора мыши.
q Затем нужно нарисовать новую линию, начинающуюся в точке расположения уже зафиксированной последней вершины многоугольника и заканчивающуюся в точке нахождения в данной момент курсора.
Одна из возможных реализаций рассматриваемого способа представлена в Листинге 4.
Листинг 4. Реализация функции FormMouseMove
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
Graphics g = CreateGraphics();//Создаем объект Graphics
Pen pen = new Pen(Color.Black, 1);
switch (drMode)
{
case DrawMode.Ribbon:
if (PointsList.Count < 1) break;
Refresh();//Рисовать незамкнутый контур фигуры
//Нарисовать линию от последней вершины до курсора
g.DrawLine(pen, PointsList[PointsList.Count - 1], e.Location);
break;
default: break;
}
oldCursor.X = e.X;//Запоминаем горизонтальную
oldCursor.Y = e.Y;//и вертикальную координаты курсора
pen.Dispose(); //Освобождаем ресурсы пера
g.Dispose(); //Освобождаем ресурсы объекта Graphics
}
Примечание. Рисование непосредственно на форме – это не самый удачный способ формирования графических изображений в ее клиентной области. Альтернативным и наиболее часто применяемым способом является способ, использующий компоненту под название PictureBox. Эту компоненту располагают в клиентной части формы и соответствующих реакций формы на внешние события используют аналогичные реакции компоненты PictureBox.
Дата публикования: 2015-11-01; Прочитано: 244 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!