Члены-переменные, используемые типами Point, Rectangle, Region и Size, внутренне представлены целочисленными данными. Если вам потребуется более "тонкая" детализация, можете использовать, соответственно, типы PointF, RectangleF и SizeF, которые (как вы можете догадаться) отображаются в соответствующие значения с плавающим разделителем. Но, независимо от внутреннего представления, все эти типы имеют аналогичные множества членов, включая ряд перегруженных операторов.
Первым утилитарным типом, о котором вам следует знать, является тип 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, подобно 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 = 50;
pt3.Y = 30;
if (r1. Contains(pt3)) Console.WriteLine("Point находится внутри прямоугольника!");
else Console.WriteLine("Point находится вне прямоугольника!");
Console.ReadLine();
}
Тип Region представляет внутреннюю часть геометрической фигуры. С учетом этого становится ясно, почему конструкторы класса Region требуют, чтобы вы предоставили им на вход некоторый уже существующий геометрический шаблон. Предположим, например, что вы создали прямоугольник размером 100×100 пикселей. Чтобы получить доступ к внутренней области прямоугольника, вы можете написать следующее.
// Получение внутренней части прямоугольника.
Rectangle r = new Rectangle(0, 0, 100, 100);
Region rgn = new Region(r);
Имея внутреннюю часть фигуры, вы можете манипулировать ею с использованием различных членов, наподобие следующих:
• Complement() – изменяет данный объект Region на часть указанного графического объекта, не пересекающуюся с данным объектом Region;
• Exclude() – изменяет данный объект Region на ту его часть, которая не пересекается с указанным графическим объектом;
• GetBounds() – возвращает Rectangle(F), который представляет прямоугольный регион, ограничивающий данный объект Region;
• Intersect() – изменяет данный объект Region на его пересечение с указанным графическим объектом:
• Transform() – трансформирует данный объект Region с помощью указанного объекта Matrix;
• Union() – изменяет данный объект Region на его объединение с указанным графическим объектом;
• Translate() – сдвигает координаты данного объекта Region на указанную величину.
Надеюсь, что вы получили общее представление об этих координатных примитивах. Если же вам нужны подробности, обратитесь к документации .NET Framework 2.0 SDK.
Замечание.Типы Size и SizeF заслуживают небольшого дополнительного комментария. Каждый из этих типов определяет свойства Height (высота) и Width (ширина), а также набор перегруженных операций.
Читать дальше