Контекст устройств. GDI, драйверы и устройства вывода., страница 4

При вращении точки объекта вращаются вокруг начала отсчета.

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

Отражение отображает объект относительно горизонтальной или вертикальной оси.

Все эти преобразования можно выразить в матричной форме, используя матрицы размером 3х3. Тогда матричная форма трансляции запишется так:

Хотя любое линейное преобразование можно выразить в форме последовательности пяти перечисленных основных преобразований, обобщенное линейное преобразование может не быть просто трансляцией, масштабированием, вращением, сдвигом или отражением. Обобщенное линейное преобразование выражается следующей матричной формулой:

Именно этот тип матриц приложение может передать функции SetWorldTransform. Вторым параметром этой функции является указатель на структуру XFORM, определенную следующим образом:

typedet struct _XFORM (

FLOAT eM11 ;

FLOAT eM12 ;

FLOAT eM21;

FLOAT eM22;

FLOAT eDx;

FLOAT eDy ;

} XFORM;

Перед тем, как начинать вручную перемножать матрицы, ознакомьтесь с функцией CombineTransform. Действие этой функции как раз заключается в перемножении двух матриц преобразования, выраженных в форме структуры XFORM.

Поскольку преобразование пространств устанавливается для контекста устройства, оно преобразует логические координаты из мирового пространства в пространство страницы. Координаты пространства страницы являются объектом дальнейшего преобразования, определенного режимом отображения, как описано ранее.

В листинге 1 приведена небольшая функция, создающая соответствующее обратное преобразование. Если обратного преобразования не существует, функция возвращает то же преобразование, а ее значение устанавливается в FALSE, указывая на ошибку. Следуя традиции, принятой в других связанных с XFORM функциях, InvertTramsform принимает такие же указатели на входную и выходную структуру XFORM.

Листинг 11.1. Обращение преобразования пространств._______________

BOOLInvertTransform(LPXFORMIpxformResult, CONSTXFORM *lpxform)

{XFORM xformTmp;

FLOAT D;

D = lpxform->eMll*lpxform->eM22 - lpxtorm->eM12*lpxform->eM21;

if (D == 0.0) {

lpxformResult->eM11 = 1.0;

lpxformResult->eM12 = 0.0;

lpxformResult->eM21 = 0.0;

lpxformResult->eM22 = 1.0;

lpxformResult->eDx = 0.0;

lpxformResult->eDy = 0.0;

return FALSE ;

} xfonnTmp. eMIl = lpxfonn->eM22 / D;

xformTmp->eM12 = -lpxform->eM12 / D;

xformTmp->eM21 = -lpxform->eM21 / D;

xformTmp->eM22 = lpxform->eMll / D;

xformTmp->eDx = (lpxtorm->eM21*lpxform->eDy -lpxform->eM22*lpxform->eDx) / D;

xformTmp->eDy = (lpxform->eM12*lpxform->eDx - lpxform->eM11*lpxform->eDy) / D;

*lpxformResult =xformTmp;

returnTRUE;

}

И последнее замечание: функция SetWorldTransform не даст никаких результатов, если сначала не будет установлен графический режим контекста устройства в GM_ADVASNCED с помощью функции SetGraphicMode. Для того, чтобы установить графический режим обратно в GM_COMPATIBLE, приложение должно установить матрицу преобразования мировых координат в тождественную матрицу.

Объекты рисования

Преобразование координат определяет расположение объектов на устройстве вывода, в котором они будут выводиться, а их внешний вид определяется с помощью объектов GDI.

GDI поддерживает множество объектов рисования: перья, кисти, шрифты, палитры и растровые изображения. Приложения, использующие эти объекты, должны выполнить следующее:

1. Создать объект GDI.

2. Выбрать объект GDI в контекст устройства.

3. Вызвать функцию вывода GDI.

4. Выбрать объект вне контекста устройства.

5. Разрушить объект.