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

Рисование сегмента эллипса

Сегмент эллипса (рис.) можно нарисовать при помощи функции 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);

}

47

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