примерах. Но это не всегда так, в некоторых ситуациях может потребоваться нарисовать относительно верхнего левого угла всего окна (включая границу) или даже относительно верхнего левого угла экрана. В большинстве случаев, однако, если документация не говорит обратное, можно предполагать, что речь идет о пикселях относительно верхнего левого угла клиентской области.

Мы вернемся к рассмотрению этого вопроса после изучения прокрутки экрана, когда речь пойдет об использовании трех различных координатных систем: мировых, страницы и устройства.

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.HeightTopLeft.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 имеет достаточно много свойств чтения-записи для задания или извлечения его размеров в различных комбинациях:

Свойство Описание
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату