Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
Проверка попадания в область, отличную от прямоугольной
Проверка попадания в область, отличную от прямоугольной
Теперь давайте выясним, как выполнить проверку попадания в область, форма которой отличается от прямоугольника? Предположим, что вы обновили свое приложение так, что теперь в нем отображается геометрический шаблон неправильной формы, и при щелчке на этом шаблоне его тоже требуется выделить с помощью контура (рис. 20.21).
Рис. 20.21. Проверка попадания в многоугольники
Этот геометрический образ был создан на форме с помощью метода FillPath() типа Graphics. Указанный метод получает на вход экземпляр объекта GraphicsPath, инкапсулирующий последовательность соединенных линий, кривых и строк. Добавление новых элементов в экземпляр GraphicsPath осуществляется с помощью последовательности связанных методов Add, как описывается в табл. 20.9.
Таблица 20.9. Связанные методы Add класса GraphicsPath
Методы | Описание |
---|---|
AddArc() | Добавляет к имеющейся фигуре эллиптическую дугу |
AddBezier() AddBeziers() | Добавляет к имеющейся фигуре кубическую кривую Безье (или множество кривых Безье) |
AddClosedCurve() | Добавляет к имеющейся фигуре замкнутую кривую |
AddCurve() | Добавляет к имеющейся фигуре кривую |
AddEllipse() | Добавляет к имеющейся фигуре эллипс |
AddLine() AddLines() | Добавляет к имеющейся фигуре сегмент линии |
AddPath() | Добавляет к имеющейся фигуре указанный GraphicsPath |
AddPie() | Добавляет к имеющейся фигуре сектор круга |
AddPolygon() | Добавляет к имеющейся фигуре многоугольник |
AddRectangle() AddRectangles() | Добавляет к имеющейся фигуре прямоугольник (или несколько прямоугольников) |
AddString() | Добавляет к имеющейся фигуре текстовую строку |
Укажите using System.Drawing.Drawing2D и добавьте новый член GraphicsPath в класс Form. В рамках конструктора формы постройте множество элементов, представляющих соответствующую траекторию.
public partial class MainForm: Form {
GraphicsPath myPath = new GraphicsPath();
public MainForm() {
// Создание нужного пути.
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
}
Затем обновите имеющийся обработчик события MouseDown, чтобы проверить присутствие указателя мыши в границах GraphicsPath. Как и для типа Region, это можно сделать с помощью члена IsVisible().
protected void OnMouseDown(object sender, MouseEventArgs e) {
// Получение значений (х, у) для щелчка мыши.
Point mousePt = new Point(e.X, e.Y);
…
else if(myPath.IsVisible(mousePt)) {
isImageClicked = true;
imageClicked = ClickedImage.StrangePath;
this.Text = "Вы щелкнули на странной фигуре…";
}
…
}
Наконец, измените обработчик Paint, как предлагается ниже.
private void MainForm_Paint(object sender, PaintEventArgs e) {
Graphics g = e.Graphics;
// Рисование фигуры.
g.FillPath(Brushes.Sienna, myPath);
// Рисование контура (при щелчке на соответствующей фигуре)
if (isImageClicked == true) {
Pen outline = new Pen(Color.Red, 5);
switch(imageClicked) {
…
case ClickedImage.StrangePath:
g.DrawPath(outline, myPath);
break;
default:
break;
}
}
}
Исходный код. Проект HitTestinglmages размещен в подкаталоге, соответствующем главе 20.
- Попадание в заданную область и операции перетаскивания для PictureBox
- 5. Null-значения и проверка условий
- Добавление цели в рабочую область для собраний
- Добавление повестки в рабочую область для собраний
- Добавление участников в рабочую область
- 12.1. Автоматизированная проверка безопасности
- 12.3. Проверка конфигурации
- Проверка, что сервер Firebird запущен
- Проверка на вирусы с помощью сканера Dr.Web
- Проверка правописания
- Проверка и ремонт
- Проверка диска на наличие ошибок