Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция_5(слайды)_2012.doc
Скачиваний:
14
Добавлен:
21.08.2019
Размер:
496.13 Кб
Скачать

Рисование точки

Функция рисования точки SetPixel устанавливает цвет точки с заданными координатами:

COLORREF WINAPI SetPixel(

HDC hdc, // контекст отображения

Int nXPos, // X-координата точки

Int nYPos, // y-координата точки

COLORREF clrref); // цвет точки

Параметр hdc определяет контекст отображения, для которого необходимо изменить цвет точки;

Параметры nXPos и nYPos определяют координаты точки в системе координат, которая зависит от установленного для контекста hdc режима отображения.

Последний параметр clrref определяет новый цвет точки.

Задать цвет точки можно с помощью макрокоманды RGB, позволяющей сконструировать цвет в формате COLORREF из отдельных компонент красного (r), зеленого (g) и голубого (b) цвета:

#define RGB(r,g,b)

Например, для установки красного цвета точки, расположенной в начале системы координат (0,0) можно использовать запись:

SetPixel(hdc, 0, 0, RGB(0xff, 0, 0));

Функция SetPixel возвращает цвет, который был использован для рисования точки. Возвращаемое значение может отличаться от заданного параметром clrref. В случае ошибки оно будет равно -1.

Функция GetPixel позволяет узнать цвет точки, заданной идентификатором контекста отображения и координатами:

COLORREF WINAPI GetPixel(HDC hdc, int nXPos, int nYPos);

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

Рисование прямой линии

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

BOOL LineTo(

HDC hDC, // дескриптор контекста устройства;

Int nX, // х - координата конечной точки;

Int nY // у - координата конечной точки

);

Вызов функции LineTo после вызова функции MoveToEx осуществит рисование от текущей точки до указанной конечной точки отрезка. Текущая позиция пера устанавливается в точку nX, nY.

Например: нарисовать прямоугольник у которого последняя точка совпадает с первой.

{

POINT pt[5]={{100,100},

{200,100},{200,200},{100,200},{100,100}};

MoveToEx(hDC,pt[0].x,pt[0].y,NULL);

for (int i=0; i<5;++1)

LineTo(hDC,pt[i].x,pt[i].y)

}

Рисование связанных отрезков

С помощью функции Polyline можно нарисовать последовательность связанных отрезков. Прототип:

BOOL Polyline (HDC hdc, CONST POINT* lppt, int cPoints),

где lppt – это адрес массива точек, а cPoints – количество точек. Пример2: рисования прямоугольника.

{

POINT pt[5]={{100,100},

{200,100},{200,200},{100,200},{100,100}};

Polyline(hDC, pt, 5);

}

Дуги

Дуги в Windows рисуются как часть эллипса.

Для рисования дуг предназначены функции Arc, ArcTo и AngleArc. Прототип Arc:

BOOL Arc(HDC hdc,

int x1, int y1, // верхний левый угол

int x2, int y2, // правый нижний угол

int x3, int y3, // начало дуги

int x4, int y4 // конец дуги

)

(x3,y3)

(x1,y1)

(x2,y2)

(x4,y4)

Дуги рисуются против часовой стрелки. Направление дуги можно получить вызовом функции GetArcDirection или установить вызовом функции SetArcDirection.

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

Функция:

BOOL AngleArc( hDC, nX, nY, dwRadius, eStartAngle, eSweepAngle )

рисует дугу окружности, а не эллипса.

Лекция №6. Перья

По умолчанию при рисовании используется перо BLACK_PEN. Для изменения структуры пера GDI позволяет создавать объекты логических перьев.

Логическое перо представляет собой описание требований к перу со стороны приложения.

Для дескрипторов логических перьев зарезервирован тип HPEN (handle to a pen). Типом HPEN можно заменить тип HGDIOBJ, но использование HGDIOBJ вместо HPEN требует обязательного преобразования типа.

Стандартные перья

В Win32 GDI определено четыре типа стандартных перьев:

Для получения дескриптора стандартного пера необходимо вызвать функцию GetStockObject, передав ей индекс стандартного объекта:

hPen=(HPEN)GetStockObject(WHITE_PEN).

Получив значение дескриптора, нужно выбрать объект пера в контекст устройства:

SelectObject(hDC,hPen).

После этого все функции, рисующие линии будут использовать перо WHITE_PEN.

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

SetDCPenColor (HDC hdc, COLORREF crColor).

Функция возвращает предшествующий цвет пера DC.

Например, необходимо нарисовать градиентную заливку одним пером:

{

HGDIOBJ hOld=SelectObject(hDC,GetStockObject(DC_PEN));

for (int i=0; i<256; ++i) {

SetDCPenColor(hDC,RGB(255-i,128,i));

MoveToEx(hDC,10,i+10,NULL);

LineTo(hDC,266,i+10);

}

SelectObject(hDC,hOld);

}

Простые перья создаются вызовом функции CreatePen или CreatePenIndirect.

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

Первый аргумент- стиль пера, возможные значения которого приведены ниже:

При этом все линии имеют толщину в 1 пиксель.

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

Пример: Создать простое сплошное (однородное) перо красного цвета толщиной 5 логических единиц:

hPen = CreatePen(PS_SОLID, 5, RGB(255, 0, 0));

Также можно создать простое перо вызовом функции CreatePenIndirect:

HPEN CreatePenIndirect(CONST LOGPEN* lplgpn);

Этой функции в качестве параметра передается адрес структуры типа LOGPEN:

typedef struct tagLOGPEN {

UINT style; // стиль пера

POINT width; // толщина в логических единицах

COLORREF color; // цвет

} LOGPEN;

Для вызова функции CreatePenIndirect необходимо:

А) сначала определить переменную типа LOGPEN, например:

LOGPEN logpen;

Б) полям этой переменной присвоить нужные значения, например:

logpen.style = PS_S0LID;

logpen.width.x = 10;

logpen.color = RGB(255, 0, 0);

в) вызвать функцию CreatePenIndirect:

hPen = CreatePenIndirect(&logpen);

Пример: Допустим, приложению требуются три нестандартных пера: красное толщиной 2, зеленое толщиной 5 и синее пунктирное.

a) Сначала нужно определить переменные для хранения дескрипторов этих перьев:

static HPEN hPenl. hPen2, hРеnЗ;

б) Сами перья могут быть созданы в процессе обработки сообщения WM_CREATE:

hPenl = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));

hPen2 = CreatePen(PS_SOLID, 5, RGB(0, 255, 0)):

hPen3 = CreatePen(PS_DASH, 1, RGB(0, 0, 255)):

в) в процессе обработки сообщения WM_PAINT можно выбрать одно из этих перьев в контекст устройства и рисовать с его помощью:

SelectObject(hDC, hPenl);

// ... функции рисования линий

SelectObject(hDC, hPen2);

// ... функции рисования линий

г) в процессе обработки сообщения WM_DESTROY рекомендуется удалить эти перья:

DeleteObject(hPenl);

DeleteОbject(hPen2):

De1eteОbject(hPen3);

Можно создавать перья, объединяя вызовы функций CreatePen и SelectObject в одну инструкцию:

SelectObject(hDC, CreatePen(PS_DОT, 0, RGB(255, 255, 0)));

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

DeleteObject(SelectObject(hDC, GetStockObject(BLACK_PEN)));

Рисование замкнутых фигур

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]