Прототип к варианту 12 - Отсечение_1, страница 4

Во время работы приложения сохраняются значения нескольких манипуляторов. Для этого в программе создается массив, в котором хранятся манипуляторы пяти регионов и переменная для хранения объединенного региона.

Многоугольные регионы считаются относительно сложными — для их определения используются массивы точек. Для создания регионов всегда следует использовать замкнутые многоугольники (координаты последней точки должны совпадать с координатами первой). В Win32 функция CreatePolyPolygonRgn автоматически замыкает многоугольник, но в WinlG это не происходит. Работа с многоугольниками подробно рассматривается в главе 8 при описании функций для рисования многоугольников.

Функция PtlnRegion позволяет быстро узнать, принадлежит ли точка к заданному региону. Этот прием легко расширяется для выполнения сложных проверок принадлежности в графических программах.

Обработчик события Paint демонстрирует использование регионов в процессе вывода. Функция PaintRgn использует для закраски фона кисть, выбранную в настоящий момент в контексте устройства. Цвет этой кисти определяется свойством FillColor по аналогии с тем, как цвет пера определяется свойством ForeColor. Для работы функции FrameRgn, которая обводит регион рамкой, необходим объект-кисть, создаваемый функцией CreateSolidBrush. Кисти и другие графические объекты рассматриваются в главе 8. Возможно, вы заметили, что процедура не пытается сохранить текущее состояние контекста устройства и восстановить его в конце своей работы. Дело в том, что ни одна из функций API в этой процедуре не изменяет состояние контекста устройства. Хотя модификация свойства FillColor изменяет состояние контекста, но вполне очевидно, что изменение состояния контекста устройства через свойство Visual Basic не может конфликтовать с Visual Basic.

Если при вызове какой-либо команды объединенного региона выделено несколько регионов, приложение выбирает один регион и объединяет с ним все остальные регионы функцией CombineRgn.

Регионы являются объектами GDI. В Winl6 объекты GDI не удаляются автоматически, поэтому для предотвращения утечки ресурсов абсолютно необходимо удалять все созданные объекты. В Win32 все ресурсы по возможности закрепляются за конкретными приложениями, что снижает риск утечки ресурсов, однако удаление ненужных объектов считается полезной привычкой в программировании и потому выполняется даже в Win32.

Все ненужные объекты следует удалять

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

Рекомендации для самостоятельной работы

-Дополните пример Viewport так, чтобы область отсечения ограничивала вывод границами области просмотра.

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

-Создайте окно, занимающее две разные области на экране (подсказка: обратитесь к описанию функции SetWindowRgn и проекту Round.vbp).

Функция StrokePath обводит траекторию зеленым пером, толщина которого равна трем единицам. Траектория, созданная на базе текста, состоит из кривых, образующих контуры текста. Обводка траектории означает ее прорисовку выбранным пером. Функция API WidenPath расширяет траекторию с учетом толщины пера. Эксперименты с функцией WidenPath также остаются читателю для самостоятельной работы.