- •1. Цель работы
- •2. Краткая теория
- •2.1. Работа с перьями
- •2.2. Работа с кистью
- •2.2.1. Кисть для сплошной закраски
- •2.2.2. Кисти типа HatchBrush
- •2.2.3. Кисти типа TextureBrush
- •2.2.4. Градиентные кисти
- •2.3. Проверка попадания в область изображения
- •2.4. Проверка попадания в область, отличную от прямоугольной
- •2.5. Определение цветовых значений
- •2.6. Стандартное диалоговое окно выбора цвета
- •3. Пример выполнения работы
- •3.1. Визуальное проектирование диалогового окна
- •3.2. Проектирование программного кода
- •3.2.1. Начальное рисование фигуры
- •3.2.2. Реализация движения фигуры
- •3.2.3. Программная реализация «отскакивания от стенок»
- •3.2.4. Изменение скорости движения круга
- •3.2.5. Создание диалоговой панели выбора цвета заливки
- •3.2.6. Создание свойства для получения цвета
- •3.2.7. Проверка попадания курсора мыши внутрь круга
- •If (прямоугольник.Contains(точка_курсора))
- •3.2.8. Изменение цвета круга
- •4. Варианты заданий для самостоятельной работы
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;
}
}
}
