
- •1) Для создания контекста метафайла используется функция CreateMetaFile:
- •3) Если имеется идентификатор метафайла, то метафайл можно скопировать в обычный дисковый файл, с помощью функции CopyMetaFile :
- •4) Можно проиграть метафайл в контексте отображения или контексте устройства, вызвав функцию PlayMetaFile:
- •6) Для того чтобы воспользоваться метафайлом, хранящимся в виде дискового файла, его нужно загрузить функцией GetMetaFile, указав в качестве параметра путь к соответствующему файлу:
- •Изменились размеры или местоположение окна;
- •Клиентская область была полностью или частично закрыта другим окном или выпадающим меню, а теперь закрывающий объект исчез;
- •Приложение вызвало одну из функций работы с полосами прокрутки.
- •Битовые изображения в формате ddb
- •Загрузка изображений из ресурсов приложения
- •Int winapi GetObject(
- •Int cbBuffer, // размер буфера
- •Void far* lpvObject); // адрес буфера
- •Захват изображения
- •1) Чтобы вывести изображение экрана в окно необходимо в первую очередь создать контекст для устройства display с помощью функции CreateDc("display", null, null, null) или GetDc(null);
- •3) Далее необходимо выбрать созданный точечный рисунок в этот контекст устройства при помощи вызова функции SelectObject.
- •If (!hWnd)
- •Int wmId, wmEvent;
- •Рисование точки
- •Int nXPos, // X-координата точки
- •Int nYPos, // y-координата точки
- •Int nX, // х - координата конечной точки;
- •Int nY // у - координата конечной точки
- •Рисование прямоугольника
- •Int winapi FrameRect(
- •Рисование сегмента эллипса
- •Рисование сектора эллипса
- •Рисование многоугольников
- •Int far* lpnPolyCounts, // адрес массива количества точек
- •Int cPolygons); // количество многоугольников
Рисование точки
Функция рисования точки 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 для рисования замкнутых закрашенных или незакрашенных фигур, таких как прямоугольники, эллипсы, многоугольники с прямыми и скругленными углами и т. д.
Для закрашивания внутренней области замкнутых фигур используется кисть, задаваемая как атрибут контекста отображения. Внешний контур фигуры обводится пером, которое также выбирается в контекст отображения. Учитываются и остальные атрибуты, такие, как режим отображения, режим фона, код растровой операции.