Для указания такой информации пространство имен 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 требуют, чтобы вы предоставили им на вход некоторый уже существующий геометрический шаблон. Предположим, например, что вы создали прямоугольник размером 100x100 пикселей. Чтобы получить доступ к внутренней области прямоугольника, вы можете написать следующее.
// Получение внутренней части прямоугольника.
Rectangle r = new Rectangle(0, 0, 100, 100);
Region rgn = new Region(r);