примерах. Но это не всегда так, в некоторых ситуациях может потребоваться нарисовать относительно верхнего левого угла всего окна (включая границу) или даже относительно верхнего левого угла экрана. В большинстве случаев, однако, если документация не говорит обратное, можно предполагать, что речь идет о пикселях относительно верхнего левого угла клиентской области.
Мы вернемся к рассмотрению этого вопроса после изучения прокрутки экрана, когда речь пойдет об использовании трех различных координатных систем: мировых, страницы и устройства.
Size и SizeF
Подобно Point
и PointF
размеры выступают в двух вариантах. Структура Size
предназначена для работы с целыми значениями, SizeF
— для значений с плавающей точкой. В остальном Size
и SizeF
идентичны. Мы сосредоточимся здесь на структуре Size
.
Во многом Size
аналогична структуре Point
. Она имеет два целых свойства, которые представляют горизонтальное и вертикальное расстояния, основное различие состоит в том, что вместо X
и Y
эти свойства называются Width
и Height
. Можно представить предыдущую диаграмму с помощью кода:
Size АВ = new Size(20, 10);
Console.WriteLine('Moved {0} across, {1} down', AB.Width, AB.Height);
Строго говоря структура Size
математически представляет то же, что и Point
, но концептуально она предназначена для использования немного другим образом. Point
применяется, если говорится о местоположении объекта, a Size
— когда речь идет о размере чего-то.
В качестве примера рассмотрим нарисованный ранее прямоугольник с координатой вверху слева (0, 0) и размером (50, 50):
Graphics dc. = е.Graphics;
Pen BluePen = new Pen(Color.Blue, 3);
dc.Rectangle(BluePen, 0, 0, 50, 50);
Размер этого прямоугольника равен (50, 50) и может быть представлен экземпляром Size
. Нижний правый угол также находится в точке (50, 50), но будет представляться экземпляром Point
. Чтобы увидеть различия, предположим, что мы рисуем прямоугольник в другом месте, так что его верхняя левая координата будет (10, 10).
dc.DrawRectangle(BluePen, 10, 10, 50, 50);
Теперь нижний правый угол имеет координаты (60, 60), но размер не изменился — по-прежнему (50, 50).
Дополнительный оператор был перезагружен для точек и размеров так, чтобы можно было добавлять размер к точке задавал другую точку:
static void Main(string [] args) {
Point TopLeft = new Point (10, 10);
Size RectangleSize = new Size(50, 50);
Point BottomRight = TopLeft + RectangleSize;
Console.WriteLine('TopLeft = ' + TopLeft);
Console.WriteLine('BottomRight = ' + BottomRight);
Console.WriteLine('Size = ' + RectangleSize);
}
Этот код, выполняемый как простое консольное приложение, создает следующий вывод:

Отметим, что этот вывод показывает также, как метод ToString()
объектов Point
и Size
был переопределен для вывода значения в формате {X, Y}.
Аналогично можно вычесть Size
из Point
, чтобы задать Point
, или складывать два размера Size
, задавая другой размер Size
. Однако невозможно сложить точку Point
с другой точкой Point
. Компания Microsoft определила, что такое действие не имеет концептуального смысла, поэтому было решено не создавать никакою перезагружаемого оператора + который бы позволял это сделать.
Можно также явно преобразовать Point
в Size
и наоборот:
Point TopLeft = new Point(10, 10);
Size S1 = (Size)TopLeft;
Point P1 = (Point)S1;
При этом преобразовании значению S1.Width
присваивается значение TopLeft.X
, а S1.Height
— TopLeft.Y
. Следовательно, S1
содержит (10, 10). P1
будет содержать те же значения, что и TopLeft
.
Rectangle и RectangleF
Эти структуры предcтавляют прямоугольную область (обычно на экране). Так же, как и в случае с Point
и Size
, мы рассмотрим только структуру Rectangle
. RectangleF
по сути идентична, за исключением того, что свойства, представляющие размеры, используют float
, в то время как в Rectangle
использует int
.
Rectangle
можно рассматривать как точку в верхнем левом углу прямоугольника и Size
, которая представляет его размер. Один из его конструкторов действительно получает Point
и Size
в качестве параметров, Можно увидеть это переписывая предыдущий код рисования прямоугольника
Graphics dc = е Graphics;
Pen BluePen = new Pen(Color Blue, 3);
Point TopLeft = new Point(0, 0);
Size HowBig = new Size(50, 50);
Rectangle RectangleArea = new Rectangle(TopLeft, HowBig);
dc.DrawRectangle(BluePen, RectangleArea);
Этот код также использует альтернативное переопределение Graphics.DrawRectangle()
, который получает Pen
и структуру Rectangle
в качестве своих параметров.
Можно также создать Rectangle
, используя значения в таком порядке как отдельные числа: верхняя левая горизонтальная координата, верхняя левая вертикальная координата, отдельно ширина и высота:
Rectangle RectangleArea = new Rectangle(0, 0, 50, 50)
Rectangle
имеет достаточно много свойств чтения-записи для задания или извлечения его размеров в различных комбинациях:
Свойство | Описание |
---|