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

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

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

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

2.1.1 Область Видимости

Из книги C++ автора Хилл Мюррей

2.1.1 Область Видимости Описание вводит имя в области видимости. То есть, имя может использоваться только в определенной части программы. Для имени, описанного в функции (такое имя часто называют локальным), эта область видимости простирается от точки описания до конца


4.1 Область Видимости

Из книги Процессы жизненного цикла программных средств автора Автор неизвестен

4.1 Область Видимости Есть четыре вида областей видимости: локальная, файл, программа и класс.Локальная: Имя, описанное в блоке (#9.2), локально в этом блоке и может использоваться только в нем после места описания и в охватываемых блоках. Исключение составляют метки (#9.12),


1.2 Область распространения

Из книги ИНФОРМАЦИОННАЯ ТЕХНОЛОГИЯ ОЦЕНКА ПРОГРАММНОЙ ПРОДУКЦИИ ХАРАКТЕРИСТИКИ КАЧЕСТВА И РУКОВОДСТВА ПО ИХ ПРИМЕНЕНИЮ автора Автор неизвестен


1 ОБЛАСТЬ ПРИМЕНЕНИЯ

Из книги СРЕДСТВА ПРОГРАММНЫЕ СИСТЕМ ВООРУЖЕНИЯ. ПОРЯДОК РАЗРАБОТКИ автора Автор неизвестен

1 ОБЛАСТЬ ПРИМЕНЕНИЯ Настоящий стандарт определяет шесть характеристик, которые с минимальным дублированием описывают качество программного обеспечения. Данные характеристики образуют основу для дальнейшего уточнения и описания качества программного обеспечения.


1 ОБЛАСТЬ ПРИМЕНЕНИЯ

Из книги Собираем компьютер своими руками автора Ватаманюк Александр Иванович


Область уведомлений

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Область уведомлений Как и в предыдущих версиях операционной системы Windows, область уведомлений используется для отображения иконок запущенных программ, которые находятся в памяти. К примеру, сюда выводится иконка Диспетчера задач, механизма регулировки звука, системные


Проверка попадания в область изображения

Из книги Office 2007. Мультимедийный курс автора Мединов Олег

Проверка попадания в область изображения Проверить попадание в область типа, производного от Control (например, типа PictureBox очень просто, поскольку такой тип может сам отвечать на события мыши. Но что делать в том случае, когда нужно выполнять проверку попадания в область


Рабочая область

Из книги Windows Vista автора Вавилов Сергей

Рабочая область Рабочая область Excel 2007 называется элементом пользовательского интерфейса, включающим в себя ячейки, строки, столбцы и листы текущей книги, а также строку формул. Все основные действия по созданию и редактированию документов Excel 2007 выполняют именно в


Область уведомлений

Из книги AutoCAD 2009 для студента. Самоучитель автора Соколова Татьяна Юрьевна

Область уведомлений Область уведомлений находится справа на Панели задач. На ней располагаются значки программ, продолжающих свою работу после закрытия их окон. Другими словами – значки программ, работающих в фоновом режиме. Кроме того, в области уведомлений размещены


Область

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

Область Областью называются плоские замкнутые объекты, которые образуются из нескольких двумерных объектов. Команда REGION формирует область и вызывается из падающего меню Draw ? Region или щелчком на пиктограмме Region на панели инструментов Draw.Над созданными областями можно


11.7.7 Область для разработчиков

Из книги Как спроектировать современный сайт автора Вин Чои

11.7.7 Область для разработчиков Первоначально область для разработчиков (vendor specific area) использовалась в сообщениях для пересылки сведений, специфичных для конкретной реализации. Однако в начале применения BOOTP эта область оставалась свободной, хотя большой объем


Область

Из книги AutoCAD 2009. Учебный курс автора Соколова Татьяна Юрьевна

Область Области – это элементы, структурирующие страницу по вертикали и помогающие дизайнеру визуально распределить элементы по оси Y. Размеры областей можно рассчитывать несколькими способами, но наиболее эффективным считается золотое


Область

Из книги AutoCAD 2008 для студента: популярный самоучитель автора Соколова Татьяна Юрьевна

Область Областью называются плоские замкнутые объекты, которые образуются из нескольких двумерных объектов. Команда REGION формирует область и вызывается из падающего меню Draw ? Region или щелчком на пиктограмме Region панели инструментов Draw.Над созданными областями можно


Область

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

Область Областью называются плоские замкнутые объекты, которые образуются из нескольких двумерных объектов. Команда REGION формирует область и вызывается из падающего меню Draw ? Region или щелчком на пиктограмме Region на панели инструментов Draw.Над созданными областями можно


16.3. Область применения

Из книги Справка по SQL автора

16.3. Область применения Как один из вариантов грамотного применения перенаправления ввода/вывода, можно назвать разбор и "сшивание" вывода от команд (см. Пример 11-6). Это позволяет создавать файлы отчетов и журналов регистрации


Проверка попадания в диапазон. Предикат BETWEEN.

Из книги автора

Проверка попадания в диапазон. Предикат BETWEEN. Предикат BETWEEN проверяет, попадают ли значения проверяемого выражения в диапазон, задаваемый пограничными выражениями, соединяемыми служебным словом AND. Естественно, как и для предиката сравнения, выражения в предикате BETWEEN