Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метода по ОАиП.doc
Скачиваний:
13
Добавлен:
11.05.2015
Размер:
3.21 Mб
Скачать

6.11. Функция Polygon и режим закрашивания многоугольника

Функция рисования многоугольника:

Polygon(hdc,pt,iCount);

pt– это массив структур типаPOINT,iCount– число точек; если последняя точка в массиве не совпадает с первой, то добавляется линия, их соединяющая.

Внутренняя область фигуры закрашивается текущей кистью. По умолчанию режим закрашивания равен ALTERNATE (попеременный), т.е. закрашиваются только те фрагменты внутренней области многоугольника, которые получаются путем соединения линий с нечетными номерами (1, 3, 5...), другие фрагменты внутренней области не закрашиваются.

Режим закрашивания устанавливается функцией:

SetPolyFillMode(hdc,iMode);

iMode– режим закрашивания,WINDING(сквозной) – закрашиваются все внутренние области. Для иллюстрации приведем пример:

звезда, находящаяся слева, нарисована в режиме ALTERNATE, а звезда, находящаяся справа – в режимеWINDING.

6.12. Пример отображения линий

Если в предыдущей программе (Second Example) заменить case WM_PAINT... и убрать лишние переменные, получим программу (Third Example), в которой рисуются прямоугольник, эллипс, прямоугольник со скругленными углами и два отрезка. Программа показывает, что функции, определяющие области, закрашивают их, поэтому отрезки не видны там, где нарисован эллипс. Результат работы программы приведен на рис. П 6.4.

. . .

case WM_PAINT:

hdc = BeginPaint (hwnd, &ps) ;

Rectangle (hdc, cxClient /8, cyClient /8, 7*cxClient /8, 7*cyClient /8) ;

MoveToEx (hdc, 0, 0, NULL) ;

LineTo (hdc, cxClient, cyClient) ;

MoveToEx (hdc, 0, cyClient, NULL) ;

LineTo (hdc, cxClient, 0) ;

Ellipse (hdc, cxClient /8, cyClient /8, 7*cxClient /8, 7*cyClient /8) ;

RoundRect (hdc, cxClient /4, cyClient /4, 3*cxClient /4, 3*cyClient /4,

cxClient /4, cyClient /4) ;

EndPaint (hwnd, &ps) ;

return 0 ; . . .

Рис. П 6.4. Результат программы Third Example

6.13. Управление областями вывода и отсечением

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

В среде Windowsиспользуются функции, работающие с прямоугольными областями, использующими структуры типаRECT(прямоугольник) и произвольными областями – регионами (regions).

Работа с прямоугольниками

Простейшим средством, задающим границу области вывода, является прямоугольник. Функции отображения прямоугольных областей используют указатель на структуру rectтипаRECT(прямоугольник), имеющую поля:left,top,right,bottom, заданные в логических единицах.

Функция FillRect (hdc, &rect,hBrush); закрашивает прямоугольник (не включая правую и нижнюю координаты) заданной кистью.

Функция FrameRect(hdc, &rect,hBrush); использует кисть для рисования прямоугольной рамки, но не закрашивает внутреннюю область.

Функция InvertRect(hdc, &rect); инвертирует все пиксели в прямоугольнике, устанавливая единичные биты в ноль, а нулевые – в единицу, т.е. переводит белую область в черную, черную – в белую (зеленую – в фиолетовую).

Windowsсодержит функции, позволяющие легко манипулировать со структурами типаRECT:

– установка всех полей структуры RECTв заданные значения:

SetRect(&rect, xLeft, yTop, xRight, yBottom);

– перемещение на заданное число координат вдоль осей xиy:

OffsetRect(&rect,x,y);

– увеличение или уменьшение размеров прямоугольника:

InflateRect(&rect,x,y);

– установка полей структуры прямоугольника в ноль:

SetRectEmpty(&rect);

– копирование одного прямоугольника в другой:

CopyRect(&DestRect, &SrcRect);

– пересечение двух прямоугольников:

IntersectRect(&DestRect, &SrcRect1, &SrcRect2);

– объединение двух прямоугольников:

UnionRect(&DestRect, &SrcRect1, &SrcRect2);

– определение, является ли прямоугольник пустым:

bEmpty=IsRectEmpty(&rect);

– определение, содержится ли точка внутри прямоугольника:

bInRect=PtInRect (&rect,point);