русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

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


Дата добавления: 2013-12-23; просмотров: 926; Нарушение авторских прав


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

Режим 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):

 

 
 


+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.

 



<== предыдущая лекция | следующая лекция ==>
Режим MM_ISOTROPIC | Многоугольник


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.005 сек.