Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции -Процедурное программирование в Windows.doc
Скачиваний:
13
Добавлен:
13.09.2019
Размер:
742.91 Кб
Скачать

Режим mm_anisotropic

При использовании режима MM_ANISOTROPIC, в отличие от MM_ISOTROPIC, Windows не производит масштабирования осей координат так, чтобы логическая единица измерения имела одинаковые физические размеры по осям x и y.

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

SetMapMode (hDC, MM_ANISOTROPIC);

SetWindowExtEx (hDC, 1000, 1000, NULL);

SetViewportExtEx (hDC, xClient, yClient, NULL);

SetViewportOrgEx (hDC,0, yClient, NUULL);

В данном случае левый нижний угол рабочей области экрана будет иметь нулевые координаты, а правый верхний – координаты (1000, 1000):

1000

+Y

+X 1000

Рис. Адаптация режима MM_ANISOTROPIC

Таким образом, в режиме MM_ANISOTROPIC квадрат будет растягиваться так, чтобы занять все окно, не сохраняя пропорций сторон. Квадрат не всегда будет квадратом.

Вывод графических объектов

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

Отображение точки

Для отображения одного пиксела можно воспользоваться функцией GDI SetPixel:

rgbTrueColor = SetPixel (hDC, x, y, rgbColor);

Первый параметр данной функции содержит индекс контекста устройства. Второй и третий параметры определяют координаты пиксела (в логических координатах). Четвертый параметр задает RGB-цвет отображаемого пиксела, эту величину можно получить при помощи макроопределения RGB:

rgbColor = RGB (byRed, byGreen, byBlue);

Заметим, что так как устройства отображения поддерживают ограниченное число цветов, то функция SetPixel отображает точку цветом, наиболее близким к rgbColor, который поддерживается устройством отображения. При этом функция SetPixel возвращает величину RGB-цвета, которым в действительности отображается точка.

Приложение может определить цвет точки с данными координатами. Для этого используют функцию GetPixel:

rgbPixelColor = GetPixel (hDC,x,y);

Первый параметр функции определяет индекс контекста устройства, а второй и третий – координаты пиксела.

Для изменения начальной позиции пера используют функцию MoveTo:

MoveTo (hDC,x,y);

Координаты текущей позиции пера, определенные в контексте устройства, можно получить при помощи функции GetCurrentPosition:

DWORD dwPoint;

dwPoint = GetCurrentPosition (hDC);

При этом в младшем слове переменной dwPoint содержится x-координата, а в старшем слове – y- координата текущей позиции пера.

Таким образом, для рисования прямой линии из точки с координатами (xBegin, yBegin) в точку с координатами (xEnd, yEnd) функции MoveTo и LineTo нужно использовать вместе:

MoveTo (hDC, xBegin, yBegin);

LineTo (hDC,xEnd, yEnd);

Для отрисовки ломаной линии следует использовать функцию PolyLine:

PolyLine (hDC, &ptArray, number);

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

Результат работы функции PolyLine аналогичен одному вызову функции MoveTo (для первого элемента массива ptArray) и последующим number-1 вызовам функции LineTo (для остальных элементов массива ptArray), за исключением того, что функция PolyLine не меняет текущую позицию пера и выполняется быстрее. Текущую позицию пера изменяют только функции MoveTo и LineTo.

Последняя рассматриваемая GDI функция, отображающая линию – это функция Arc:

Arc (hDC, xLeft, yTop, xRight, yButtom, xBegin, yBegin, xEnd, yEnd);

Эта функция рисует дугу эллипса. Эллипс задается прямоугольником, в который он вписан. Прямоугольник определяется верхним левым (xLeft, yTop) и правым нижним (xRight, yButtom) углами. Дуга строится против часовой стрелки от точки пересечения эллипса с прямой, соединяющей центр эллипса с точкой (xBegin, yBegin), до точки пересечения эллипса с прямой, соединяющей центр эллипса с точкой (xEnd, yEnd):

xLeft xEnd xRight

yEnd

yTop

xBegin

yBegin

yBottom

Рис. Отрисовка дуги эллипса

Для функций, отображающих линии, Windows использует перо, выбранное в данный момент в контексте отображения. Перо может иметь различный цвет, ширину, структуру. По умолчанию в контексте устройства установлено перо, рисующее тонкие сплошные линии черного цвета (оно называется BLACK_PEN). Кроме того существует еще два стандартных пера – WHITE_PEN и NULL_PEN. Перо WHITE_PEN рисует тонкие сплошные белые линии, а перо NULL_PEN при его использовании ничего не изменяет на рисунке.

Если вы хотите изменить перо, используемое в контексте устройства, на другое стандартное перо (WHITE_PEN или NULL_PEN), то надо сначала получить индекс стандартного пера, вызвав функцию GetStockObject:

HPEN hPen; //Дескриптор пера

int nPenIdent; //Тип пера

nPenIdent = NULL_PEN; //Получаем дескриптор пера NULL_PEN

hPen = GetStockObject (nPenIdent); //Дескриптор пера помещается

// переменную hPen

После получения индекса пера его можно выбрать в контекст устройства при помощи функции SelectObject:

HDC hDC; //Контекст устройства

HPEN hOldPen; //Индекс старого пера

hOldPen = SelectObject (hDc, hPen); //Изменяем перо, определенное

//в контексте устройства

Первый параметр функции SelectObject содержит индекс контекста устройства, перо которого вы хотите изменить, а второй содержит индекс нового пера. Функция SelectObject возвращает индекс пера, которое ранее было выбрано в контексте отображения (hOldPen). Вызвав еще раз функцию SelectObject с параметром, равным hOldPen, можно восстановить старую кисть.

В некоторых случаях недостаточно белого и черного пера. Вам может понадобиться, например, перо зеленого цвета, которое рисует штрихпунктирные линии. Для этого необходимо создать собственное перо. Для создания собственного пера (являющегося GDI объектом) можно воспользоваться функциями CreatePen или CreatePenIndirect. Данные функции возвращают дескриптор логического пера, которое может быть выбрано в контексте устройства при помощи функции SelectObject так же, как и в случае предопределенного пера.

Рассмотрим функцию CreatePen. При помощи этой функции можно создать перо заданного вами цвета, ширины, а также типа (сплошное, штрихпунктирное и т.д.).

hPen = CreatePen (hPenStyle, nWidth, rgbColor);

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

Флаг hPenStyle Тип линии

PS_SOLID

PS_DASH

PS_DOT . . . . . . . . . . . .

PS_DASHDOT _ . _ . _ . _ . _

PS_DASHDOTDOT _ . . _ . . _ . . _

PS_NULL

Рис. Флаги типов линий

Второй параметр nWidth – задает ширину линий, рисуемых данной кистью, в логических единицах. Этот параметр должен быть равен единице для перьев PS_DASH, PS_DOT, PS_DASHDOT и PS_DASHDOTDOT, в противном случае перо будет рисовать сплошные линии.

Последний параметр, rgbColor, определяет RGB-цвет создаваемой кисти.

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

HPEN OldPen, hDashGreenPen;

hDashGreenPen = CreatePen (PS_DASH, 1, RGB (0,255, 0));

OldPen = SelectObject (hDashGreenPen);

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

  • Нужно обязательно удалять все объекты GDI, которые вы создаете – Windows не очищает их автоматически.

  • Нельзя удалять объекты GDI, пока они выбраны в контексте устройства.

  • Нельзя удалять стандартные объекты Windows.

Логические перья, создаваемые функциями CreatePen и CreatePenIndirect, также являются GDI объектами, следовательно, после их использования они должны быть удалены. Для этого применяют функцию DeleteObject:

DeleteObject (hDashGreenPen);

Единственный параметр функции содержит индекс удаляемого логического объекта, в данном случае индекс кисти – hDashGreenPen.

Наиболее удобно создавать логические перья при обработке сообщения WM_CREATE, а удалять их при обработке сообщения WM_DESTROY.