Прототип к варианту 13 – Отсечение_2
Лучший способ освоить графические функции Win32 — поэкспериментировать с ними в i граммах. В каждом из следующих примеров объединяются многие принципы, описанные в; главе, от создания и выбора объектов до рисования фигур и построения траекторий. В некоторых примерах также используются функции, которые будут рассмотрены далее, однако их применение будет в достаточной степени очевидным. Начнем с примера Path.vbp, который показывает как использовать траекторию для создания сложных областей отсечения и добиться впечатляющих графических эффектов.
Пример: Path.vbp
Очень простое приложение Path.vbp строит траекторию на основе текста и преобразует ее в ol ласть отсечения контекста устройства. Затем в контексте устройства рисуется узор, который у секается по границам текста. На главной форме проекта находятся четыре кнопки; три из нихз полняют область отсечения различными узорами, а четвертая обводит траекторию при помои функции API StrokePath. На рис. 8.4 показан один из эффектов отсечения в приложении Path.vb]
Описание проекта и формы
Проект Path.vbp состоит из единственного файла PATH.FRM (точнее, двух, если считать файл Ш< растровым изображением для графического поля). В листинге 8.1 приведен заголовок и программный код формы.
Графическое поле Out заполняется 256-цветным растровым рисунком в формате ,ВМР, который в прошлом входил в поставку Windows и Windows NT. Данные растра хранятся в файле PATH.FRX.
В переменной WhichDrawing хранится тип узора, используемый программой в данный момент. Ниже определяются два массива со значениями синусов и косинусов. Предварительное заполнение массивов ускоряет работу программы, поскольку эти значения не приходится заново пересчитывать при каждом использовании.
Объявления функций API можно разместить в форме, но при этом необходимо использовать ключевое слово Private.
Массивы allCos и allSin заполняются синусами и косинусами углов от 0° до 90° с приращением в Г. Переход от градусов к радианам, используемым в тригонометрических функциях, осуществляется по стандартной формуле.
Все кнопки объединены в массив элементов. Обработчик события Click просто сохраняет индекс нажатой кнопки и перерисовывает окно вывода.
Функция выполняет различные операции в зависимости от того, какая кнопка была нажата (то есть от состояния переменной WhlchDrawing). Сначала она сохраняет текущее состояние контекста устройства функцией SaveDC, а затем начинает построение траектории. В окне выводятся две строки текста. После завершения траектории функция SelectClipPath объединяет траекторию с областью отсечения — при наличии параметра RGN_COPY траектория просто копируется в область отсечения.
В секции Case 0 используется встроенный объект — черное перо, выбранное в контексте устройства. Поскольку объект является встроенным, его незачем уничтожать — он автоматически удаляется из контекста устройства при вызове RestoreDC в конце функции.
В секции Case 1 создается однородное цветное перо. Обратите внимание на сохранение текущего пера при выборе нового пера в контексте устройства. После того как все эллипсы будут нарисованы, старое перо восстанавливается в контексте устройства. Однако это делается не для того, чтобы восстановить предыдущее состояние контекста устройства — эта задача решается позднее функцией RestoreDC. Дело в том, что созданное перо необходимо уничтожить, а выбранные в контексте объекты уничтожать никогда не следует. При выборе старого пера новое перо автоматически исключается из контекста, и его можно безопасно уничтожить.
Функция TileBitmaps копирует растровое изображение из графического поля prtBmp в графическое поле Out. При этом создается мозаичный узор — растр многократно повторяется, заполняя все выходное графическое поле. Эта реализация мозаичного повторения нехороша, поскольку размеры растра жестко кодируются в программе, Однако функции для определения размеров растровых изображений будут рассматриваться только в следующей главе, поэтому сейчас мы не будем отвлекаться на них. Замена TileBitmaps надежной и универсальной функцией, работающей с растрами любого размера, остается читателю для самостоятельной работы — после чтения главы 9.
- Функция StrokePath обводит траекторию зеленым пером, толщина которого равна трем единицам; Траектория, созданная на базе текста, состоит из кривых, образующих контуры текста. Обводка траектории означает ее прорисовку выбранным пером. Функция API Widen Path расширяет траекторию с учетом толщины пера. Эксперименты с функцией WidenPath также остаются читателю для самостоятельной работы.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.