Для указания такой информации пространство имен System.Drawing определяет типы Point, Rectangle, Region и Size. Очевидно, что тип Point (точка) представляет координату (x, у). Типы Rectangle (прямоугольник) содержат пару точек, представляющих левый верхний и нижний правый угол прямоугольной области. Типы Size (размер) подобны Rectangle, но эта структура представляет конкретные размеры, используя длину и ширину. Наконец, типы Region (регион) предлагают способ представления непрямоугольных областей.
Члены-переменные, используемые типами Point, Rectangle, Region и Size, внутренне представлены целочисленными данными. Если вам потребуется более "тонкая" детализация, можете использовать, соответственно, типы PointF, RectangleF и SizeF, которые (как вы можете догадаться) отображаются в соответствующие значения с плавающим разделителем. Но, независимо от внутреннего представления, все эти типы имеют аналогичные множества членов, включая ряд перегруженных операторов.
Тип Point(F)
Первым утилитарным типом, о котором вам следует знать, является тип System.Drawing.Point(F). В отличие от иллюстративных типов Point, создававшихся в предыдущих главах, тип Point(F) GDI+ поддерживает целый ряд очень полезных членов, включая следующие:
• +, -, ==, != – перегруженные варианты различных C#-операций;
• X, Y – обеспечивают доступ к соответствующим внутренним значениям (х, у) типа Point;
• IsEmpty – возвращает true (истина), если x и у установлены равными 0.
Для иллюстрации работы с утилитарными типами GDI+ рассмотрите следующее консольное приложение (названное UtilTypes), в котором используется тип System.Drawing.Point (не забудьте установить ссылку на System.Drawing.dll).
using System;
using System.Drawing;
namespace UtilTypes {
public class Program {
static void Main(string[] args) {
// Создание и смещение точки.
Point pt = new Point(100, 72);
Console.WriteLine(pt);
pt.Offset(20, 20);
Console.WriteLine(pt);
// Перегруженные операции Point.
Point pt2 = pt;
if (pt == pt2) WriteLine ("Точки одинаковы");
else WriteLine("Точки различны");
// Изменение значения X для pt2.
pt2.X = 4000;
// Отображение каждого значения X.
Console.WriteLine("Первая точка: {0} ", pt);
Console.WriteLine("Вторая точка: {0} ", рt2);
Console.ReadLine();
}
}
}
Тип Rectangle(F)
Типы Rectangle, подобно Point, оказываются полезными во многих приложениях (и особенно в GUI-приложениях). Одним из наиболее полезных методов типа Rectangle является метод Contains(). Этот метод позволяет выяснить, находится ли данный тип Point или Rectangle в рамках границ некоторого другого объекта. Позже в этой же главе вы увидите, как использовать этот метод для проверки попадания в область GDI-изображений. А пока что рассмотрите следующий простой пример.
static void Main(string[] args) {
…
// Вначале Point находится вне прямоугольника.
Rectangle r1 = new Rectangle(0, 0, 100, 100);
Point pt1 = new Point(101, 101);
if (r1.Contains(pt3)) Console.WriteLine("Point находится внутри прямоугольника!");
else Console.WriteLine("Point находится вне прямоугольника!");
// Теперь поместим Point в прямоугольник.
pt3.X
pt3.Y = 30;
if (r1.Contains(pt3)) Console.WriteLine("Point находится внутри прямоугольника!");
else Console.WriteLine("Point находится вне прямоугольника!");
Console.ReadLine();
}
Класс Region
Тип Region представляет внутреннюю часть геометрической фигуры. С учетом этого становится ясно, почему конструкторы класса Region требуют, чтобы вы предоставили им на вход некоторый уже существующий геометрический шаблон. Предположим, например, что вы создали прямоугольник размером 100×100 пикселей. Чтобы получить доступ к внутренней области прямоугольника, вы можете написать следующее.
// Получение внутренней части прямоугольника.
Rectangle r = new Rectangle(0, 0, 100, 100);
Region rgn = new Region(r);