Изотропный режим MM_ISOTROPIC
Сразу после перевода режима отображения в состояние MM_ISOTROPIC мы получаем возможность настроить коэффициент масштабирования. Для этой цели при помощи функций SetWindowExtEx() и SetViewportExtEx() изменяем значения протяженности. Первая из них отвечает за установку желаемых размеров логического окна, вторая – за текущие ширину и высоту рабочей области.
functionSetWindowExtEx(DC: HDC; nXExtent, nYExtent : Integer;
SIZE : pSize ) : boolean;
где DC – дескриптор контекста; nXExtent и nYExtent – протяженности окна по осям X и Y соответственно в логических единицах измерения; параметр SIZE является ссылкой на структуру TSize, предназначенную для хранения предыдущих значений протяженности. Использование параметра SIZE необязательно, и синтаксис метода позволяет передавать вместо него пустой указатель nil. В случае успешного выполнения метод возвратит значение true.
functionSetViewportExtEx(DC: HDC; nXExtent, nYExtent : Integer;
SIZE : pSize) : boolean;
Параметры метода аналогичны параметрам функции SetWindowExtEx() за единственным исключением: аргументы nXExtent и nYExtent определяют протяженности области вывода в единицах измерения устройства.
Представьте, что мы формируем собственную систему координат, традиционно начинающуюся в левом верхнем углу (0,0) и протяженностью 100×100 единиц, т. е. правая нижняя точка имеет координаты (99,99). Взгляните на следующий листинг:
vardc:hDC;
Begin
DC:=Form1.Canvas.Handle; //получаем контекст устройства
SetMapMode(DC, MM_ISOTROPIC); //назначаем изотропный режим отображения
SetWindowExtEx(DC, 99, 99, nil); //указываем протяженность логического окна
{определяем ширину и высоту рабочей области}
SetViewportExtEx(DC, Form1.ClientWidth, -Form1.ClientHeight, nil);
Rectangle(DC,0,0,99,-99); //рисуем квадрат со стороной 100 логических
единиц
end;
В режиме MM_ISOTROPIC операционная система всегда корректирует заданные вами протяженности логического окна и области вывода. Корректировка осуществляется на основе коэффициента сжатия устройства таким образом, чтобы логические единицы измерения по обеим осям имели правильные размеры.
ОС Windows автоматически осуществляет контроль за тем, чтобы размерность логического окна соответствовала характеристикам рабочей области. Например, в нашем случае в качестве логического окна определен квадрат 100×100 единиц, и при изменении размеров рабочей области (т. е. поверхности формы Form1) операционная система «впишет» логическое окно в отведенное ему пространство (рис. 10.15).
Операционная система не допустит вывода изображения за пределами логического окна, и если вы определили протяженность окна в 100 единиц, то попытка нарисовать что-то в точке с координатами, превышающими это значение, не имеет никакого смысла.
Вернемся к формуле пересчета логических координат в физические. Варьируя числитель этой дроби, мы получим возможность масштабировать изображение. Можно внести изменения в аргументы функции SetViewportExtEx() в предыдущем примере:
SetViewportExtEx(DC, Form1.ClientWidth div2, -Form1.ClientHeight div2, nil);
Мы в два раза уменьшили значения параметров, определяющих протяженность рабочей области, что в свою очередь визуально в два раза уменьшило размер логического окна.
Дата добавления: 2016-03-15; просмотров: 799;