Здавалка
Главная | Обратная связь

Установка атрибутов контекста отображения



Контекст отображения, кроме характеристик устройства вывода, содержит указатели на выбранные в контекст инструменты рисования. Инструменты настраивают с помощью атрибутов контекста отображения (их около 20). Например, атрибуты описывают систему координат, задают настройку цвета графических объектов и цвета фона. С их помощью можно выбрать перо для рисования линий и кисть для закрашивания внутренней области замкнутых фигур. При получении контекста отображения атрибуты рисования содержат значения по умолчанию.

Рассмотрим функции установки значений атрибутов.

По умолчанию для фона операции вывода в контекст отображения выбран белый цвет. Функция SetBkColor устанавливает новый цвет для фона вывода:

 

COLORREF SetBkColor( HDC hdc, COLORREF crColor);

 

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

Тип COLORREF равноценен типу DWORD. Для получения значения цвета типа COLORREF существует функция

 

COLORREF RGB(BYTE bRed, BYTE bGreen, BYTE bBlue);

 

Она возвращает значение цвета в формате COLORREF в виде интенсивности красной (bRed), зеленой (bGreen) и голубой (bBlue) составляющих цвета. Интенсивность каждого аргумента может принимать значения в диапазоне от 0 до 255. Если все три значения равны нулю, результат – черный. Если все три – 255, результат – белый. В качестве примера в табл. 3.1 перечислены красная, зеленая и голубая составляющие системных цветов.

В случае неудачи возвращаемое значение функции RGB равно CLR_INVALID.

Существует два режима фона – непрозрачный (OPAQUE – значение по умолчанию) и прозрачный (TRANSPARENT). В режиме непрозрачного вывода цвет фона текущей позиции заменяется цветом фона вывода. В режиме TRANSPARENT цвет фона не заменяется. Режим фона устанавливает функция SetBkMode:

 

int SetBkMode( HDC hdc, int iBkMode);

 

Параметр iBkMode принимает значение TRANSPARENT или OPAQUE. В случае успешного выполнения функция возвращает значение предыдущего режима, иначе – нуль.

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

 

int SetROP2( HDC hdc, int fnDrawMode);

 

Параметр fnDrawMode определяет режим рисования и принимает значения из табл. 3.2. В случае успешного выполнения функция возвращает значение предыдущего режима рисования, иначе – нуль.

По умолчанию цвет вывода текста выбран черным. Другой цвет вывода символов текста устанавливает функция SetTextColor:

 

COLORREF SetTextColor(HDC hdc, COLORREF crColor);

 

Параметр crColor задает новый цвет. В случае успешной установки нового цвета возвращается значение предыдущего цвета, иначе – CLR_INVALID. Этот цвет также используют при преобразовании разноцветных изображений в моноцветные и наоборот.

По умолчанию расстояние между буквами равно 0. Расстояние между буквами устанавливает функция SetTextCharacterExtra:

 

int SetTextCharacterExtra( HDC hdc, int nCharExtra );

 

Параметр nCharExtra определяет расстояние между символами в логических единицах. Во всех режимах (кроме ММ_ТЕХТ) значение nCharExtra кратно пикселю. В случае успешного выполнения функция возвращает предыдущий интервал между символами, иначе – 231.

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

Функция CreateSolidBrush создает кисть цвета crColor:

 

HBRUSH CreateSolidBrush( COLORREF crColor);

 

Функция CreateHatchBrush создает штрихованную кисть:

 

HBRUSH CreateHatchBrush( int fnStyle, COLORREF clrref);

 

Параметр fnStyle определяет стиль штриховки и принимает одно из следующих значений:

Значение Стиль штриховки
HS_BDIAGONAL Линии под углом в 45 градусов
HS_CROSS В клетку без наклона
HS_DIAGCROSS В клетку с наклоном в 45 градусов
HS_FDIAGONAL Линии под углом в 135 градусов
HS_HORIZONTAL Горизонтальные линии
HS_VERTICAL Вертикальные линии

 

Параметр clrref определяет цвет линий штриховки.

В контекст кисть выбирают, вызывая функцию SelectObject:

 

HGDIOBJ SelectObject( HDC hdc, HGDIOBJ hgdiobj);

 

Параметр hgdiobj описывает выбираемый объект (в этом случае – кисть). В случае успешного выполнения функция возвращает дескриптор предыдущего объекта.

Если созданная кисть более не нужна, в контекст выбирают предыдущую кисть, а созданную удаляют вызовом функции DeleteObject:

 

BOOL DeleteObject( HGDIOBJ hgdiobj);

 

Параметр hgdiobj может указывать на перо, кисть, шрифт, изображение, область или палитру. В случае успешного удаления возвращает ненулевое значение.

Пример. Создать кисть в клетку из горизонтальных и вертикальных линий малинового цвета, выбрать ее в контекст, закрасить фигуры и удалить созданную кисть.

Решение этой задачи может иметь следующий вид:

 

HBRUSH hOldBrush, hNewBrush;

hNewBrush = CreateHatchBrush(HS_CROSS, RGB(255, 0, 255));

hOldBrush = (HBRUSH)SelectObject(hdc, hNewBrush);

//Здесь могут быть закрашены фигуры

SelectObject(hdc, hOldBrush);

DeleteObject(hNewBrush);

 

По умолчанию линии рисуют черным пером шириной в 1 пиксель. Функция CreatePen создает перо указанного стиля, ширины и цвета:

 

HPEN CreatePen( int fnPenStyle, int nWidth, COLORREF crColor);

 

Параметр fnPenStyle определяет стиль пера и принимает одно из следующих значений:

Значение Стиль линии пера
PS_SOLID Сплошная
PS_DASH Штриховая
PS_DOT Пунктирная
PS_DASHDOT Штрихпункгирная, одна точка на одну черточку
PS_DASHDOTDOT Штрихпунктирная, две точки на одну черточку
PS_NULL Невидимая
PS_INSIDEFRAME Линии для обводки замкнутых фигур

 

Параметр nWidth задает ширину пера. В зависимости от режима отображения ширина может быть указана в пикселях, долях дюйма или долях миллиметра. Ширина прерывистых линий может быть равна только единице. Параметр crColor задает цвет линий.

В случае успешного выполнения функция CreatePen возвращает дескриптор созданного пера, иначе – NULL.

Обратите внимание на особенности рисования толстых линий. Линия стиля PS_SOLID располагается по обе стороны базовой линии, указанной в функции рисования линии. Причем концы линии всегда закругляются. Линия стиля PS_INSIDEFRAME всегда расположена с внутренней стороны обводящей линии.

В контекст перо выбирают, вызывая функцию SelectObject. Если созданное перо более не нужно, в контекст выбирают предыдущее перо. Созданное перо удаляют вызовом функции DeleteObject.

Пример. Создать перо для рисования сплошных линий шириной в 3 пикселя голубого цвета, выбрать его в контекст, нарисовать линии и удалить созданное перо.

Решение этой задачи может иметь следующий вид:

 

HPEN hOldPen, hNewPen;

hNewPen = CreatePen(PS_SOLID, 3, RGB(0, 255, 255));

hOldPen = (HPEN)SetectObject(hdc, hNewPen);

//Здесь могут быть нарисованы линии

SelectObject(hdc, hOldPen);

DeleteObject(hNewPen);

 

По умолчанию текущая позиция пера равна (0, 0). Многие из функций рисования линий вывод начинают с текущей позиции. Для установки другой позиции пера вызывают функцию MoveToEx:

 

BOOL MoveToEx( HDC hdc, int X, int Y, LPPOINT lpPoint);

 

Параметры X и Y задают новую позицию в логических единицах, lpPoint указывает на структуру типа POINT:

 

typedef struct {

LONG x;

LONG y;

} POINT;

В поля x и у этой структуры после вызова этой функции будут записаны координаты предыдущей позиции. При lpPoint = NULL предыдущая позиция не сохраняется.

В случае успешного перемещения функция возвращает ненулевое значение.

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

По умолчанию установлен режим отображения ММ_ТЕХТ. В этом режиме начало системы координат находится в левом верхнем углу рабочей области, ось х направлена вправо, ось у – вниз, позиции отсчитывают в пикселях.

Режим отображения изменяют вызовом функции SetMapMode:

 

int SetMapMode( HDC hdc, int fnMapMode );

 

Параметр fnMapMode задает новый режим отображения и может принимать одно из следующих значений:

Значение Описание
MM_ANISOTROPIC Произвольные направления для осей координат, произвольные логические единицы
MM_HIENGLISH Логическая единица равна 0.001 дюйма. Ось х направлена вправо, ось у – вверх
MM_HIMETRIC Логическая единица равна 0.01 миллиметра. Ось х направлена вправо, ось у – вверх
MM_ISOTROPIC Логические единицы произвольны и одинаковы по обеим осям
MM_LOENGLISH Логическая единица равна 0.01 дюйма. Ось х направлена вправо, ось у – вверх
MM_LOMETRIC Логическая единица равна 0.1 миллиметра. Ось х направлена вправо, ось у – вверх
MM_TEXT Логические единицы равны размерам пикселя. Ось х направлена вправо, ось у – вниз
MM_TWIPS Логическая единица равна двадцатой части точки принтера (1/1440 дюйма). Ось х направлена вправо, ось у – вверх

 

В режимах ММ_ ANISOTROPIC и MM_ISOTROPIC для установки ориентации осей и единиц вызывают функции SetWindowExtEx и SetViewportExtEx.

В случае успешного выполнения функция возвращает значение предыдущего режима отображения, иначе – нуль.

По умолчанию начало системы координат установлено в точку (0, 0). Для перемещения начала системы координат окна вызывают функцию SetWindowOrg:

 

BOOL SetWindowOrgEx( HDC hdc, int x, int y, LPPOINT lpPoint);

 

Параметры функции SetWindowOrgEx подобны параметрам функции MoveToEx.

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

Для изменения масштабов последовательно вызывают две функции: сначала функцию SetWindowExtEx, а потом SetViewportExtEx.

Синтаксис функции SetWindowExtEx:

 

BOOL SetWindowExtEx( HDC hdc, int nxWinExt, int nyWinExt, LPSIZE lpSize);

 

Параметры nxWinExt и nyWinExt задают горизонтальный и вертикальный размеры окна в логических единицах. Параметр lpSize указывает на структуру типа SIZE:

 

typedef struct {

LONG cx;

LONG cy;

} SIZE;

 

В эту структуру будут записаны значения предыдущих логических размеров окна (если lpSize не равен NULL).

Синтаксис функции SetViewportExtEx:

 

BOOL SetViewportExtEx (HDC hdc, int nxViewExt,

int nyViewExt, LPSIZE lpSize);

 

Параметры nxViewExt и nyViewExt определяют горизонтальный и вертикальный размеры окна в физических единицах. Параметр lpSize указывает на структуру типа SIZE. В эту структуру будут записаны предыдущие физические размеры окна (если lpSize не равен NULL).

Тогда логические координаты точки (xWin, yWin) в физические координаты (xView, yView) преобразуют по формулам:

 

xView = (xWin – xWin0) * nxViewExt / nxWinExt + xView0,

yView = (yWin – yWin0) * nyViewExt / nyWinExt + yView0,

 

где (xWin0, yWin0) и (xView0, yView0) указывают на смещение соответственно логической и физической системы координат. Отсюда видно, что значения отношений nxViewExt/nxWinExt и nyViewExt/nyWinExt и есть устанавливаемые значения коэффициентов масштабирования.

При таком подходе обеспечивается большой выбор коэффициентов масштабирования и направлений осей координат. Действительно, значения nxWinExt и nyWinExt, а также nxViewExt и nyViewExt могут быть любыми допустимыми значениями типа int. Вдобавок, меняя знак коэффициента масштабирования, можно изменить направление оси координат.

Смещение физической и логической систем координат по умолчанию равно (0, 0). Для установки смещения используют функции SetViewportOrgEx и SetWindowOrgEx.

Функция SetViewportOrgEx устанавливает новое начало (xView0, yView0) физической системы координат:

 

BOOL SetViewportOrgEx( HDC hdc, int xView0, int yView0, LPPOINT lpPoint);

 

Значения xView0 и yView0 задают в физических единицах. В структуру, адрес которой передается через параметр lpPoint, записываются старые координаты начала системы координат. Функция возвращает TRUE в случае успеха и FALSE при возникновении ошибки.

Функция SetWindowOrgEx устанавливает начало (xWin0, yWin0) логической системы координат:

 

BOOL SetWindowOrgEx(HDC hdc, int xWin0, int yWin0, LPPOINT lpPoint);

 

Значения xWin0 и yWin0 задают в логических единицах. В структуру, адрес которой передается через параметр lpPoint, записываются старые координаты начала системы координат. Функция возвращает TRUE в случае успеха и FALSE при возникновении ошибки.

Рекомендуется изменять только одно начало отсчета – либо физических, либо логических координат.

Пример. Создать систему координат с началом отсчета в левом нижнем углу окна. Ось х направить слева направо, а ось у – снизу вверх. Логические значения высоты и ширины изменять от 0 до 1000. Установить одинаковый масштаб по осям х и у.

Следующий фрагмент кода решает эту задачу:

 

SetMapMode(hdc, MM_ISOTROPIC);

SetWindowExt(hdc, 1000, 1000);

SetViewportExt(hdc, cxClient, -cyClient);

SetViewportOrg(hdc, 0, cyClient);

 

Вывод текста







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.