примерах. Но это не всегда так, в некоторых ситуациях может потребоваться нарисовать относительно верхнего левого угла всего окна (включая границу) или даже относительно верхнего левого угла экрана. В большинстве случаев, однако, если документация не говорит обратное, можно предполагать, что речь идет о пикселях относительно верхнего левого угла клиентской области.
Мы вернемся к рассмотрению этого вопроса после изучения прокрутки экрана, когда речь пойдет об использовании трех различных координатных систем: мировых, страницы и устройства.
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 имеет достаточно много свойств чтения-записи для задания или извлечения его размеров в различных комбинациях:
| Свойство | Описание |
|---|
