пользователей: 21281
предметов: 10473
вопросов: 178149
Конспект-online
зарегистрируйся или войди через vk.com чтобы оставить конспект.
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Режимы отображения. Инструменты для рисования

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

Таким образом, даже при перемещении окна координаты объектов внутри окна остаются неизменными.

При этом единицы, в которых измеряются координаты, зависят от режима отображения (mapping mode), установленного для данного окна.

Единицы измерения, зависящие от режима отображения, называют логическими единицами координатами.

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

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

int  WINAPI SetMapMode(HDC DC, int Mode);

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

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

Идентификатор

Значение

Эффект

MM_TEXT

 

1

Логическая единица равна пикселю, начало

координат - левый верхний угол окна,

положительное значение x - вправо,

положительное значение y - вниз (обычный

отсчет)

Идентификатор

Значение

Эффект

MM_LOMETRIC

2

 

Логическая единица равна 0.1 мм, отсчет

координат - обычный

MM_HIMETRIC

3

Логическая единица равна 0,01 мм, отсчет

координат - обычный

MM_LOENGLISH

4

 

Логическая единица равна 0,1 дюйма, отсчет

координат - обычный

MM_HIENGLISH

 

5

Логическая единица равна 0,001 дюйма, отсчет

координат - обычный

MM_TWIPS

 6

Логическая единица равна 1/12 пункта, (~1/1440 дюйма - "твип"), отсчет координат - обычный

MM_ISOTROPIC

7

 

Логические единицы и направление осей

определяются программистом с помощью функций SetWindowExtEx(…) и

SetViewportExtEx(…), единицы по осям имеют

одинаковый размер

MM_ANISOTROPIC

8

 

Логические единицы и направления осей

определяются так же, как и для MM_ISOTROPIC,

но размеры единиц по осям различны

Инструменты для рисования.

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

Все инструменты рисования используют ее для определения начальной позиции.

Функция

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

устанавливает текущую графическую позицию. Возвращает предыдущую позицию через lpPoint.

Цвет задается с помощью типа COLORREF = DWORD. Значение данного типа может интерпретироваться тремя способами, в зависимости от значения старшего байта в старшем слове. 

Если этот стаpший байт pавен нулю, то следующие тpи байта – это RGB интенсивности цвета для синего, зеленого и кpасного соответственно, поэтому:

значение $00FF0000 пpедставляет чистый синий цвет полной интенсивности,

$0000FF00 – чистый зеленый цвет,

$000000FF – чистый кpасный цвет,

чеpному цвету соответствует значение $00000000, а белому – значение $00FFFFFF.

Значения RGB могут быть легко пpеобpазованы в значения COLORREF с помощью функции

COLORREF GRB(byte r, g, b);

Если стаpший байт pавен единице, то следующий байт должен быть нулевым. Младшее слово (следующие два байта) обpазуют индекс для логической палитpы.

Таким обpазом, $01000002 является индексом 2 (третий элемент) для палитpы.

Целочисленные индексы палитры могут быть пpеобpазованы в значения COLORREF с помощью функции

COLORREF PaletteIndex(int index);

Если стаpший байт pавен двум, то следующие тpи байта пpедставляют RGB-интенсивности цвета (как и значения RGB в случае нулевого стаpшего байта), но значение будет сопоставляться с ближайшим цветом в логической палитpе в контексте текущего устpойства. Значения RGB типа COLORREF, сопоставимые с палитpой, могут быть получены из значений RGB с помощью функции

COLORREF PaletteRGB(byte r, g, b);

При создании окна в его контексте существует три предопределенных пера: BLACK_PEN, WHITE_PEN, NULL_PEN. Их описатели можно получить с помощью функции 

THandle GetStockObject(int fnObject);

а затем использовать.

Новое перо можно создать с помощью функции

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

fnPenStyle – cтили перьев: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT, PS_NULL.

nWidth- толщина(если 0, то в 1 px).

При создании окна в его контексте существует предопределенные кисти: BLACK_BRUSH, DKGRAY_BRUSH, GRAY_BRUSH, LTGRAY_BRUSH, WHITE_BRUSH, NULL_BRUSH. Их описатели можно получить с помощью функции 

HGDIOBJ GetStockObject(int fnObject);

а затем использовать.

Новую кисть можно создать с помощью нескольких функций.

Сплошная кисть:

HBRUSH CreateSolidBrush(COLORREF crColor);

Кисть для штриховки:

HBRUSH CreateHatchBrush(int fnStyle, COLORREF clrref); 

fnStyle – стили штриховок: HS_BDIAGONAL, HS_CROSS, HS_DIAGCROSS, HS_FDIAGONAL, HS_HORIZONTAL, HS_VERTICAL.

 Кисть на основании шаблона:

HBRUSH CreatePatternBrush(HBITMAP hbmp);

Выбор инструмента осуществляется функцией:

HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj); 


26.12.2015; 23:56
хиты: 1
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2016. All Rights Reserved. помощь