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

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

Polygon (hdc, pt, iCount);

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

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

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

SetPolyFillMode (hdc, iMode);

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

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

 

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

Если в предыдущей программе (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

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

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

В среде 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);



php"; ?>