Книга: C# для профессионалов. Том II

Size и SizeF

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.

Оглавление книги

Оглавление статьи/книги

Генерация: 1.501. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз