Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Реализация второго способа



Реализация второго способа несколько сложнее, чем первого, но зато более эффективная. Для этого необходимо несколько видоизменить функцию 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; Прочитано: 226 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.01 с)...