
- •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); // количество многоугольников
Рисование сегмента эллипса
Сегмент эллипса (рис.) можно нарисовать при помощи функции Chord :
BOOL WINAPI Chord(
HDC hdc, // идентификатор контекста отображения
int nxLeft, int nyTop, // верхий левый угол
int nxRight, int nyBottom, // правый нижний угол
int nxStart, int nyStart, // начало дуги
int nxEnd, int nyEnd); // конец дуги
Рис. Рисование сегмента эллипса
Рисование сектора эллипса
Для рисования сектора эллипса (рис.) следует использовать функцию Pie:
BOOL WINAPI Pie(
HDC hdc, // идентификатор контекста отображения
int nxLeft, int nyTop, // верхний левый угол
int nxRight, int nyBottom, // правый нижний угол
int nxStart, int nyStart, // начало дуги
int nxEnd, int nyEnd); // конец дуги
Рис. Рисование сектора эллипса
Рисование многоугольников
Рисование многоугольников (рис.) выполняется функцией Polygon:
BOOL WINAPI Polygon(
HDC hdc, // идентификатор контекста отображения
const POINT FAR* lppt, // указатель на массив структур POINT
int cPoints); // размер массива
Параметр hdc представляет собой идентификатор контекста отображения.
Параметр lppt указывает на массив структур POINT, в котором должны находится координаты вершин многоугольника.
Параметр cPoints определяет размер массива, который содержит координаты вершин прямоугольнитка.
Функция Polygon возвращает TRUE при нормальном завершении или FALSE при ошибке. Она не использует текущую позицию пера и не изменяет ее.
Рис. Рисование многоугольника
Функция Polygon автоматически замыкает ломаную линию, образующую многоугольник.
С помощью функции PolyPolygon можно нарисовать одновременно несколько многоугольников:
BOOL WINAPI PolyPolygon(
HDC hdc, // идентификатор контекста отображения
const POINT FAR*lppt, // указатель на массив структур POINT
Int far* lpnPolyCounts, // адрес массива количества точек
// в многоугольниках
Int cPolygons); // количество многоугольников
Функция PolyPolygon не замыкает автоматически ломаную линию, образующую многоугольник.
В контексте отображения имеется атрибут, влияющий на способ закрашивания для самопересекающихся многоугольников. По умолчанию выбран режим ALTERNATE , в котором эти области не закрашиваются (закрашиваются только те области, которые расположены между нечетными и четными сторонами многоугольника).
Расширенные перья
Для преодоления ограничений, которые связаны с простыми перьями имеется функция ExtCreatePen, создающая перья с расширенным набором атрибутов:
HPEN ExtCreatePen(
DWORD dwPenStyle, // тип, стиль и атрибуты пера
DWORD dwWidth, // толщина
CONST LOGBRUSH* lplb, // атрибуты кисти
DWORD dwStyleCount, // длина массива lpStyle
CONST DWORD* lpStyle // массив, задающий правила чередования пикселов
);
Параметр dwPenStyle может принимать значения в виде комбинации флагов, определяющих тип пера, его стиль, тип завершения линий и тип соединения линий. Возможные значения этих флагов приведены в табл. 2.6-2.9.
Пример_2: Создать приложение, которое выводит в окно параболу.
#include <windows.h>
#include <math.h>
LRESULT CALLBACK PaintWndProc(HWND,UINT,UINT,LONG);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hMainWnd;
char szClassName[] = "MyClass";
MSG msg;
WNDCLASSEX wc;
// Заполняем структуру класса окна
wc.cbSize = sizeof(wc);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = PaintWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_INFORMATION);
// Регестрируем класс окна
if (!RegisterClassEx(&wc)) {
MessageBox(NULL, "Cannot register class", "Error", MB_OK);
return 0;
}
hMainWnd=CreateWindow(szClassName,"Парабола...",
WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,
hInstance,NULL);
if (!hMainWnd)
{
MessageBox(NULL,"Не могу зарегестрировать класс окна!","Error",MB_OK);
return 0;
}
ShowWindow(hMainWnd,nCmdShow);
UpdateWindow(hMainWnd);
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK PaintWndProc(HWND hWnd,UINT Message,
UINT wParam,LONG lParam)
{
HDC hDC;
PAINTSTRUCT PaintStruct;
HPEN hpenRed,hpenOld;
int i;
static int nn=101;
switch(Message)
{
case WM_PAINT:
hDC=BeginPaint(hWnd,&PaintStruct);
hpenRed=CreatePen(PS_SOLID, 14, RGB(55,11,100));
hpenOld = (HPEN)SelectObject(PaintStruct.hdc,(HGDIOBJ)hpenRed);
for (i=300; i<=500; i++){
SetPixel(hDC,i,450-(i-300)*(i-300)*0.01,RGB(55,211,100));
SetPixel(hDC,600-i,450-(i-300)*(i-300)*0.01,RGB(0,11,255));
}
DeleteObject((HGDIOBJ)hpenRed );
DeleteObject((HGDIOBJ)hpenOld );
EndPaint(hWnd,&PaintStruct);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,Message,wParam,lParam);
}