Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР 2 Языки программирования академ.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
319 Кб
Скачать
☆

2.4. Проверка попадания в область, отличную от прямоугольной

Далее нужно выяснить, как выполнить проверку попадания в область, форма которой отличается от прямоугольника? Предположим, что данное приложение обновлено так, что теперь в нем отображается геометрический шаблон неправильной формы, и при щелчке на этом шаблоне его тоже требуется выделить с помощью контура (рис. 2.5).

Этот геометрический образ был создан на форме с помощью метода FillPath типа Graphics. Указанный метод получает в качестве параметра экземпляр класса GraphicsPath, содержащий последовательность соединенных линий, кривых и строк. Добавление новых элементов в объект GraphicsPath осуществляется с помощью последовательности связанных методов Add(), как описывается в таблице.

Метод

Описание

AddArc()

Добавляет к имеющейся фигуре эллиптическую дугу

AddBezier()

AddBeziers()

Добавляет к имеющейся фигуре кубическую кривую Безье (или множество кривых Безье)

AddClosedCurve()

Добавляет к имеющейся фигуре замкнутую кривую

AddCurve()

Добавляет к имеющейся фигуре кривую

AddEllipse()

Добавляет к имеющейся фигуре эллипс

AddLine()

AddLines()

Добавляет к имеющейся фигуре сегмент линии

AddPath()

Добавляет к имеющейся фигуре указанный GraphicsPath

AddPie()

Добавляет к имеющейся фигуре сектор круга

AddPolygon()

Добавляет к имеющейся фигуре многоугольник

AddRectangle()

AddRectangles()

Добавляет к имеющейся фигуре прямоугольник

(или несколько прямоугольников)

AddString()

Добавляет к имеющейся фигуре текстовую строку

Рис. 2.5 – Проверка попадания в многоугольник

Для реализации этих действий нужно добавить новую переменную типа GraphicsPath в класс формы, в конструкторе формы построить множество элементов, представляющих соответствующую траекторию.

public partial class Form1 : Form

{

GraphicsPath myPath = new GraphicsPath();

...

public Form1()

{

myPath.StartFigure();

myPath.AddLine(new Point(150, 10), new Point(120, 150));

myPath.AddArc(200, 200, 100, 100, 0, 90);

Point point1 = new Point(250, 250);

Point point2 = new Point(350, 275);

Point point3 = new Point(350, 325);

Point point4 = new Point(250, 350);

Point[] points = { point1, point2, point3, point4 };

myPath.AddCurve(points);

myPath.CloseFigure();

...

}

...

}

Обратите внимание на вызовы методов StartFigure() и CloseFigure(). При вызове StartFigure()можно вставить новый элемент в строящуюся траекторию. Вызов CloseFigure() закрывает имеющуюся фигуру и начинает новую (если это требуется). Также следует знать, что в том случае, когда фигура содержит последовательность соединенных линий и кривых (как в случае с экземпляром myPath), цикл завершается путем соединения конечной и начальной точек с помощью линии.

В перечисление ClickedImage нужно добавить дополнительное имя StrangePath.

enum ClickedImage

{

ImageA, ImageB, ImageC, StrangePath

}

Затем обновить имеющийся обработчик события Form1_MouseDown, чтобы проверить присутствие указателя мыши в границах GraphicsPath. Как и для типа Region, это можно сделать с помощью метода IsVisible().

private void Form1_MouseDown(object sender, MouseEventArgs e)

{

...

else if(myPath.IsVisible(mousePt))

{

isImageClicked=true;

imageClicked = ClickedImage.StrangePath;

this.Text = "Вы щелкнули на странной фигуре";

}

...

}

Наконец, обработчик события Form1_Paint нужно изменить, как предлагается ниже.

private void Form1_Paint(object sender, PaintEventArgs e)

{

...

LinearGradientBrush gb4 = new LinearGradientBrush(rect, Color.Teal, Color.Violet, LinearGradientMode.Horizontal);

g.FillPath(gb4, myPath);

//прорисовка контура (при щелчке в соответствующем месте)

if (isImageClicked == true)

{

Pen outline = new Pen(Color.Tomato, 5);

switch (imageClicked)

{

...

case ClickedImage.StrangePath:

g.DrawPath(outline, myPath);

break;

default:

break;

}

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]