Трансформации


Эта статья описывает то, как трансформации работают во фреймверке.



Система координат

Во фреймверке используются координаты относительно клиентской части окна. Клиентская часть - это часть окна без границ. Точка [0, 0] находится в левом верхнем углу клиентской части. Ось X направлена слева направо и ось Y - с верху вниз. Шаг в такой системе координат - 1 пиксель.

Система координат форм

Типы трансформаций

Есть 3 типа трансформаций, которые можно применять к элементам управления. Это трансляция или перемещение, масштабирование и вращение. Вы можете перемещать, масштабировать и вращать элементы управления относительно всех 3х осей - X, Y, Z. Хотя форма является 2х мерной, Вы можете использовать всю мощь 3х измерений для достижения различных эффектов понятным и предстказуемым способом. Например, вместо симуляции вращения элемента управления путем изменения его масштабировани, можно просто использовать вращение вокруг оси X. Трансформации применяются иерархически. Это значит, что когда у Вас есть, например, GroupBox на форме с X = 10 и Y = 25, и у Вас есть кнопка на GroupBox, и у кнопки X = 5 и Y = 5, то на форме кнопка будет находится в координатах X = 15 и Y = 30.

Порядок трансформаций

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

CTransform

Класс CTransform используется для представления трансформаций. Он наследуется от интерфейса ITransform. Перемещения указыватся в пикселях, масштабирование в абсолютных единицах(где 1 означает оригинальный размер, 2 - делает элемент в 2 раза больше, 0.1 - делает в 10 раз меньше) и вращение в радианах. Вы можете конвертировать значения между радианами и градусами и обратно с помощью вспомогательных функций фреймверка DegToRad() и RadToDeg(). Этот класс так же позволяет задавать функции обратного вызова для уведомления связанного объекта об изменениях. Вам не нужно вручную вызывать перерисовку или другие действия после изменений в связанной трансформации объекта - это делается автоматически.

Элементы управления

Вы можете получить доступ к трансформации элемента управления используя метод getTransform(). Он возвращает экземпляр ITransform. Для изменения трансформации просто используйте методы интерфейса. Некоторые элементы поддерживают не все преобразования и изменение неподдерживаемых значений не дает никакого эффекта.

Форма

Вы можете получить доступ к трансформации формы таким же самым способом как и для элемента управления, используя getTransform(). Хотя метод getTransform() формы так же возвращает ITransform, только изменения X и Y допустимы. Если Вам нужно аналогичное поведение для Вашего элемента управления, просто используйте класс CFormTransform в нем. Если Вы не указали кастомный класс трансформации в Вашем элементе управления, то CTransform будет использоваться и все типы преобразований будут доступны.

Дочерние элементы управления

У форм и элементов управления так же имеется метод getTransformControls(), который возвращает еще один экземпляр интерфейса ITransform. Он используется для трансформации всех дочерних элементов управления одновременно.