netlib.narod.ru< Назад | Оглавление | Далее >

Области и отсечение

Исторически поддержка областей появилась в Windows гораздо раньше, чем поддержка контуров. Области были доступны уже в Windows 1.0 (1985 г.), а контуры появились только в 32-разрядных версиях Windows, начиная с Windows NT 3.1 (1993 г.) и Windows 95 (1995 г.).

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

Как известно, графический контур — это набор прямых и кривых. Область описывает участок на устройстве вывода. Контур довольно просто можно преобразовать в область. Фактически один из конструкторов класса Region (определяемого в пространстве имен System.Drawing создает область прямо из контура:


Конструкторы Region (выборочно)



Region(GraphicsPath path)


Для исполнения этого конструктора все открытые фигуры закрываются. Создаваемая область включает внутренние области всех фигур контура. Если фигуры перекрываются, режим заливки контура определяет, какие внутренние участки фигур станут частью области, а какие нет. Только один метод класса Graphics использует область для рисования:


Метод FillRegion класса Graphics



void FillRegion(Brush brush, Region rgn)


Если эта область создана из контура, метод дает тот же результат, что вызов метода FillPath для исходного контура.

Только одна версия SetClip использует область непосредственно:


Методы SetClip класса Graphics (выборочно)



void SetClip(Region rgn, CombineMode cm)


Может показаться странным отсутствие версии SetClip где аргумент-область используется без аргумента CombineMode. Дело в том, что свойство Clip объекта Graphics само по себе определено как Region. Вот три свойства объекта Graphics, связанные с отсечением:


Свойства Graphics (выборочно)



Тип Свойство Доступ

Region Clip Чтение/запись
RectangleF ClipBounds Чтение
bool IsClipEmpty Чтение


Таким образом, область отсечения из объекта Region задают не вызовом

  grfx.SetClip(rgn); // Нет такого метода!

а установкой свойства Clip:

  grfx.Clip = rgn;

Свойство ClipBounds указывает наименьший прямоугольник, заключающий в себе область отсечения, a IsClipEmpty показывает, определяет ли область отсечения несуществующий участок.

С отсечением связаны еще два свойства объекта Graphics:


Свойства Graphics (выборочно)



Тип Свойство Доступ

RectangleF VisibleClipBounds Чтение
bool IsVisibleClipEmpty Чтение


Для нового объекта Graphics свойство VisibleClipBounds указывает размер поверхности для рисования, для формы — размер ее клиентской области, а для принтера — размер области печати страницы. Свойство ClipBounds указывает прямоугольник с «бесконечными» границами (на самом деле этот прямоугольник не бесконечный, а просто очень большой).

Когда вы задаете для объекта Graphics область отсечения, значение VisibieClipBounds будет равно области перекрытия прямоугольников, заданных исходными значениями свойств VisibleClipBounds и ClipBounds. Если область отсечения полностью вписывается в область экрана, то значения VisibleClipBounds и ClipBounds будут равны.

Если свойство IsClipEmpty равно true, то IsVisibleClipEmpty также будет равно true. Однако возможно, что IsClipEmpty будет равно false, но область отсечения будет за пределами границ видимой области (или области печати страницы принтера). В этом случае значение IsVisibleClipEmpty будет равно true, так как ни один из участков области отсечения не будет располагаться в пределах области экрана.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz