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

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




Для реализации первого (поточечного) способа формирования фигур необходимо предусмотреть соответствующие реакции формы на события, связанные с изменением состояния мыши (в частности, нажатие на левую клавишу). Для этого, с помощью курсора мыши активизируем форму Form1 и обратимся к окну Инспектора Свойств Объектов. Выберем в нём страницу для настройки событий (Events) и способом, описанным выше, активизируем создание пустого шаблона функции отклика на событие MouseDown (рис.10).

Рис.10. Выбор события в окне инспектора свойств формы.

Поскольку нам требуется, чтобы приложение реагировало на нажатие на клавиши "мыши", то выбираем событие MouseDown и путем двойного клика на пустом поле справа от данного события, создаем пока "пустую" функцию, которая будет вызываться каждый раз при наступлении выбранного. В результате этих действий, в окне программного текста данной формы " Form1. cs " автоматически появляется прототип функции-обработчика выбранного события под названием FormMouseDown с пустым телом:

void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TshiftState

Shift, int X, int Y)

{

}

В соответствии с описанием рассматриваемого способа формирования фигуры многоугольника, приведенного в разделе 2.1.1, в тело этой функции необходимо вставить программный текст, необходимый для выполнения следующих действий:

q После выбора места очередной вершины многоугольника и нажатии на клавишу (например, на левую) мыши необходимо выполнить следующую последовательность действий:

· Если количество вершин более одной, то нарисовать грань многоугольника в виде линии, соединяющей последнюю вершину с точкой размещения курсора мыши.

· создать новую переменную для сохранения новой вершины с координатами курсора мыши и добавить её в список вершин ListPoints.

q При необходимости завершить процесс формирования фигуры, необходимо:

· отрисовать последнюю грань многоугольника путём рисования линии, соединяющей её последнюю и начальную вершины.

· Удалить все элементы из списка, в которых хранятся вершины многоугольника, тем самым подготовив его для формирования следующей фигуры.

Один из возможных вариантов реализации функции FormMouseDown() представлен в Листинге 1.

Листинг 1.

private void Form1_MouseDown(object sender, MouseEventArgs e)

{

Graphics g = CreateGraphics(); //Создаем объект Graphics

Pen pen=new Pen(Color.Black, 1); //Создаем объект "пера"

Point pnt; //Объявляем локальную переменную для хранения координат вершины

if (e.Button == MouseButtons.Left)//Если нажата левая клавиша мыши, то…

{

if (PointsList.Count > 0) //Проверяем: если в списке есть хотя бы одна вершина

{

//то соединяем последнюю вершину с координатами курсора

g.DrawLine(pen, PointsList[PointsList.Count - 1], e.Location);

}

pnt = new Point(e.X, e.Y);// Создаем объект вершины

PointsList.Add(pnt); //Добавляем ее в список вершин

}

else //Если же нажата правая клавиша мыши, то…

{

if (PointsList.Count > 1) //Если есть хотя бы одна вершина, то…

{

//соединяем первую вершину с последней

g.DrawLine(pen, PointsList[0], PointsList[PointsList.Count - 1]);

}

PointsList.Clear();

}

oldCursor.X = e.X;// Запоминаем горизонтальную и

oldCursor.Y = e.Y;// вертикальную координаты курсора

pen.Dispose(); // Освобождаем ресурсы пера

g.Dispose(); //Освобождаем ресурсы объекта Graphics

}

Запустив приложение можно убедиться в работоспособности приведенного текста программы. Однако, рассмотренный вариант реализации функции MouseDown(…) не совсем удачная в том смысле, что, если учесть необходимость того, что эту же функцию придется использовать и для рисования контура фигуры в режиме "резинка", то новая реализация потребует изменения уже отлаженного участка программы, работающей в поточечном режиме. Поэтому для более эффективной реализации функции MouseDown(…), является введение в использование переключателя Switch, в котором учитывается режим вырисовывания. Для этого необходимо в класс главной формы ввести еще одну переменную типа перечисления для хранения режима редактирования. Соответствующая реализация этой функции приведена в листинге 2.

Листинг 2.

public partial class Form1: Form

{

List<Point> PointsList; //Список вершин фигуры

Point oldCursor; //Старое положение курсора

DrawMode drMode; //Режим рисования фигур

public Form1()

{

InitializeComponent();

PointsList = new List<Point>();

oldCursor = new Point(0,0);

drMode = DrawMode.None;

}

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:

//Если нажата левая клавиша мыши

if (e.Button == MouseButtons.Left

{

if (PointsList.Count > 0) //Если есть хотя бы одна вершина

{

//Соединяем последнюю вершину с координатами курсора

g.DrawLine(pen, PointsList[PointsList.Count - 1], e.Location);

}

pnt = new Point(e.X, e.Y);//Создаем объект вершины

PointsList.Add(pnt); //Добавляем ее в список вершин

}

else //Если нажата правая клавиша мыши

{

if (PointsList.Count > 1) //Если есть хотя бы одна вершина

{

//Соединяем первую вершину с последней

g.DrawLine(pen, PointsList[0], PointsList[PointsList.Count - 1]);

}

// Очистка списка вершин с целью его подготовки к работе

PointsList.Clear();//со следующей фигурой

}

break;

//case DrawMode.Ribbon: break;

}

oldCursor.X = e.X;//Запоминаем горизонтальную

oldCursor.Y = e.Y;//и вертикальную координаты курсора

pen.Dispose(); //Освобождаем ресурсы пера

g.Dispose(); //Освобождаем ресурсы объекта Graphics

}

}

Такой способ организации реализации функции Form1_MouseDown с использованием оператора переключателя позволяет в последующем заставить эту же функцию формы, в зависимости от используемого режима, по разному реагировать на событие нажатия на клавишу "мыши". Причем делать это никак не затрагивая участков программного текста, реализующих реакцию этой же формы на это же событие, но в других режимах ее функционирования. Введение новой реакции на событие достигается простым введением в тело переключателя Switch нового раздела case:, например, case DrawMode.Ribbon: как это показано в закомментированной строке в нижней части тела оператора Switch Листинга 2.





Дата публикования: 2015-11-01; Прочитано: 244 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



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