Для реализации первого (поточечного) способа формирования фигур необходимо предусмотреть соответствующие реакции формы на события, связанные с изменением состояния мыши (в частности, нажатие на левую клавишу). Для этого, с помощью курсора мыши активизируем форму 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.