расширение Video BIOS, предложенное VESA. Драйвер VESA или загружается, или содержится в ROM Video BIOS.
Контексты устройств (Device Contexts - DC)
Контекст устройства - структура, которая определяет набор графических объектов, связанных с ними атрибутов и графических режимов, которые обеспечивают вывод. Графические объекты включают перо для записи строки, кисть для закрашивания и заполнения, точечный рисунок для копирования или прокрутки частей экрана, палитру для определения набора доступных цветов, область для отсечения и других операций.
Перечислим атрибуты, связанные с каждыми из этих объектов.
Графический объект |
Атрибуты |
Точечный рисунок |
Размер, в байтах; протяженности (в пикселях); |
|
цветовой формат; схема сжатия; и т. д. |
Кисть |
Стиль, цвет, форма, и начало координат |
Палитра |
Цвета и размер (или число цветов) |
Шрифт |
Название Шрифта, ширина, высота, размер, |
|
набор символов, и т. д. |
Перо |
Стиль, ширина, и цвет |
Область |
Расположение и габариты |
Когда приложение создает контекст устройства, Windows автоматически сохраняет в нем набор заданных по умолчанию объектов (кроме точечного рисунка или пути). Приложение может определять атрибуты заданных по умолчанию объектов, вызывая функции GetCurrentObject и GetObject. Приложение может изменять эти значения по умолчанию, создавая новый объект и помещая его в контекст устройства, вызывая функцию SelectObject.
Графические режимы
Windows поддерживает пять графических режимов, которые позволяют приложению определить, как смешивать цвета, где размещать вывод, как выполнять масштабирование и т. д. Вот эти режимы:
Фоновый режим Определяет, как цвета фона смешиваются с существующими оконными
или экранными цветами для растровых и текстовых операций. Режим рисования
Определяет, как наносимые цвета смешиваются с существующими оконными или экранными цветами для пера, кисти, точечного рисунка, и текстовых операций.
Режим отображения Определяет, как графический образ отображается из логического представления на окно, экран, или бумагу принтера.
Режим заполнения Определяет, какова форма кисти, чтобы заполнить внутреннюю область сложных областей.
Режим растяжения Определяет, как растровые цвета смешаны с существующими оконными или экранными цветами при сжатии рисунка.
Приложение может определять заданные по умолчанию режимы,
вызывая соответственно функции GetBkMode, GetROP2, GetMapMode,
GetPolyFillMode, GetStretchBltMode. Для изменения режимов используют функции SetBkMode, SetROP2, SetMapMode, SetPolyFillMode, SetStretchBltMode.
Типы DC
Win32 API поддерживает четыре типа контекста устройств: дисплей, принтер, память и информация. Каждый тип обеспечивает работу с определенным объектом:
Дисплей |
Поддерживает операции рисования на дисплее. |
Принтер |
Поддерживает операции рисования на принтере или |
|
графопостроителе (плоттере). |
Память |
Поддерживает операции рисования на точечном рисунке. |
Информация |
Поддерживает поиск данных устройства. |
|
DC дисплея (Display DC - DDC) |
Windows предоставляет три типа контекста устройства для дисплеев: класс, общий и частный. Класс и частные контексты используются в приложениях САПР, издательских системах и т. п. Общие контексты используются в прикладных программах, которые выполняют нечастые операции рисования.
Приложение получает DDС, вызывая функцию BeginPaint или GetDC и идентифицируя окно, в котором предполагается вывод. Как правило, приложение получает контекст устройства только для рисования на клиентской области окна. Когда приложение заканчивает рисование, оно должно освободить контекст устройства, вызывая функцию EndPaint или ReleaseDC.
Класс DC
Класс DC поддерживается только для совместимости с предыдущими версиями Windows. При разработке 32-хразрядных приложений используют частный контекст устройства.
Общие DC
Общие DC - это DDC, стандартно управляемые оконными средствами Win32 API. Приложение получает дескриптор (handle), идентифицирующий один из доступных общих DC, вызывая GetDC, GetDCEx, или функцию BeginPaint. Перед возвращением этого дескриптора Windows инициализирует общий контекст устройства с заданными по умолчанию объектами, атрибутами и режимами.
Частные DC
Частные DC, в отличие от общих, сохраняют любые изменения заданных по умолчанию данных даже после вызовов из прикладной программы функций ReleaseDC или EndPaint. Частные контексты устройства не входят в кэш администратора оконного режима и поэтому не должны освобождаться после использования. Администратор автоматически удаляет частный контекст устройства после того, как связанное с ним последнее окно будет разрушено.
Приложение создает частный контекст устройства первым определением CS_OWNDC стиля класса окна при инициализации элемента стиля структуры WNDCLASS и вызова функции RegisterClass. После создания окна с CS_OWNDC стилем, приложение может вызывать GetDC, GetDCEx или BeginPaint для того, чтобы получить дескриптор, идентифицирующий частный DC.
Операции с DC
Приложению доступны следующие операции:
11
·Перечисление существующих графических объектов.
·Выбор новых графических объектов.
·Удаление существующих объектов.
·Сохранение текущих графических объектов, их атрибутов и графических режимов.
·Восстановление предварительно сохраненных графических объектов, атрибутов и режимов.
Закрашивание и рисование
Почти все прикладные программы используют экран, чтобы отобразить данные, которыми они манипулируют.
Прикладные программы используют окна как устройства вывода, а не непосредственно экран. Windows ставит DDC в соответствие окнам . Рисование в окне предотвращает сталкивание приложений и позволяет прикладным программам сосуществовать друг с другом.
Приложение рисует в окне в следующих случаях: при создании окна, при изменении размера окна, при наложении окон, при свертке или максимизировании окна, при отображении данных из открытого файла, при прокрутке, изменении или выборе части отображенных данных. Windows управляет действиями типа перемещения и установления размеров окна. Если оказывается воздействие на содержимое окна, Windows отмечает поврежденную часть окна как готовую к обновлению и при первой возможности посылает сообщение WM_PAINT. Некоторые действия управляются приложением, например, отображение открытых файлов и выбор отображенных данных.
Во всех случаях приложение может рисовать в окне, как только оно создано. Чтобы рисовать в окне, приложение должно сначала отыскать дескриптор DDC для окна. Обычно приложение выполняет большинство операций рисования в течение обработки сообщений WM_PAINT. В этом случае приложение отыскивает DDC, вызывая функцию BeginPaint. Сначала устанавливается область отсечения для DC, равная пересечению части окна, которое нуждается в обновлении и части, которая является видимой пользователю. Повторно выводятся только те части окна, которые изменились.
Windows может также посылать диспетчеру сообщения WM_NCPAINT и WM_ERASEBKGND. Эти сообщения направляют приложение, чтобы обновить неклиентскую область и фон окна. Неклиентская область - часть окна, которая находится вне клиентской области. Эта область включает области заголовка, меню окна (системное меню), и линейки прокрутки. Большинство прикладных программ полагается на заданную по умолчанию функцию окна DefWindowProc для вывода этой области. Фон окна - цвет или текстура, которым заполняется окно прежде, чем начинаются другие операции рисования. Фон закрывает любые объекты в окне.
Область обновления
Область обновления идентифицирует устаревшую часть окна, которая требует изменения. Windows использует область обновления, чтобы генерировать сообщения WM_PAINT для прикладных программ. Когда Windows решает, что окно нуждается в обновлении, она устанавливает габариты области обновления. Установка области обновления, однако, не заставляет приложение немедленно выводить. Вместо этого, приложение продолжает выбирать сообщения из очереди до ее исчерпания. Затем Windows проверяет область обновления и, если она не пуста, посылает WM_PAINT.
Синхронное и асинхронное рисование
Рисование, выполненное в течение обработки WM_PAINT асинхронно: то есть имеется задержка между моментом выдачи запроса на обновление и посылкой WM_PAINT. В течение задержки приложение обычно выбирает сообщения из очереди и выполняет другие задачи. Причина для задержки в том, что Windows вообще обрабатывает рисование в окне как операцию с низким приоритетом и пропускает вперед сообщения ввода пользователя и сообщения, которые могут воздействовать на позицию или размер окна.
Иногда необходимо вывести синхронно, то есть рисовать окно немедленно. Например, немедленно выводится главное окно приложения после его запуска. Windows выводит синхронно некоторые окна управления , типа кнопок, потому что они служат фокусом ввода пользователя. Синхронные функции UpdateWindow и RedrawWindow обеспечивают эту возможность. Они посылают сообщение WM_PAINT прямо окну, если область обновления не пуста.
Рисование без сообщения WM_PAINT
Иногда более эффективно выводить прямо в окно без ожидания WM_PAINT. Это может быть полезно, когда пользователь нуждается в немедленной обратной связи, как при перемещении или установлении размеров объекта. В таких случаях приложение обычно выводит в окно при обработке сообщений мыши или клавиатуры. Чтобы рисовать в окне без использования WM_PAINT, приложение вызывает функции GetDC или GetDCEx, чтобы отыскать DDC для окна.
Графическая подсистема Borland C++ Builder
Разработчики Borland C++ Builder уделили большое внимание возможностям работы с деловой графикой: простота и удобство ее использования напрямую сказывается на простоте и удобстве созданных приложений. Вместо дебрей графического интерфейса Windows разработчик получил несколько инструментов, сколь понятных, столь же и мощных.
Другой бич работы с графикой в Windows - проблема рационального использования ресурсов. Для больших программных комплексов она стала в последнее время нешуточной. Такие монстры, как Microsoft Office, потребляют во время работы львиную долю ресурсов. В Borland C++ Builder ресурсами GDI незримо для пользователя "заведуют" специальные менеджеры, ведущие списки всех размещенных кистей, перьев, шрифтов и т. п. и управляющие их использованием.
Обязательным для любого объекта, связанного с графикой в Borland C++ Builder является событие
__property Classes::TNotifyEvent OnChange = {read=FOnChange, write=FOnChange};
Его обработчик вызывается всякий раз, когда изменились какие-то характеристики объекта, влияющие на его внешний вид.
В стандартном GDI основой для рисования служит дескриптор контекста устройства hDC и связанные с ним шрифт, перо и кисть. В состав VCL входят объектно-ориентированные надстройки над последними, назначением которых является удобный доступ к свойствам инструментов и прозрачная для пользователя обработка всех их изменений. Сначала опишем три этих класса.
Класс TFont
Класс инкапсулирует шрифт Windows. В Borland C++ Builder допускаются только горизонтально расположенные шрифты. В конструк-
12
торе объекта по умолчанию принимается шрифт System цвета clWindowText размера 10 пунктов.
Свойства класса приведены в таблице:
-----------------------------------------------------------------
Handle |
Содержит дескриптор шрифта. |
|
|
|
|||||
Name |
Содержит |
имя |
(начертание) |
|
шрифта, |
||||
|
например, Arial |
|
|
|
|
|
|||
Style |
Содержит |
|
стиль |
(особенности |
|||||
|
начертания) шрифта: жирный, курсив, |
||||||||
|
подчеркнутый и перечеркнутый. |
|
|
||||||
Color |
Определяет цвет шрифта. |
|
|
|
|
||||
Pitch |
Определяет |
способ |
установки |
ширины |
|||||
|
символов шрифта. Значение fpFixed |
со |
|||||||
|
ответствует |
моноширинным |
шрифтам; |
||||||
|
fpVariable - шрифтам с переменной |
||||||||
|
шириной символа. Установка fpDefault |
||||||||
|
означает принятие того способа, |
||||||||
|
который определен начертанием. |
|
|
||||||
Height |
Содержит значение высоты шрифта в |
||||||||
|
пикселах. |
|
|
|
|
|
|
|
|
PixelsPerInch |
Определяет |
число |
точек |
|
на |
дюйм. |
|||
|
Первоначально |
равно числу |
точек |
на |
|||||
|
дюйм |
в контексте экрана. Программист |
|||||||
|
не |
должен изменять это свойство, |
т. |
||||||
|
к. |
оно |
используется |
системой |
для |
||||
|
приведения |
изображения на |
экране |
и |
|||||
|
принтере к одному виду |
|
|
|
|
||||
Size |
Содержит |
размер |
шрифта |
в |
|
пунктах |
|||
|
(принято в Windows). Это свойство |
||||||||
|
связано с Height соотношением. |
|
|
||||||
|
Font->Size = -Font->Height * 72 / |
|
|||||||
|
|
|
|
Font->PixelsPerInch; |
|
||||
-----------------------------------------------------------------
Класс ТРеn
Инкапсулирует перо. В конструкторе по умолчанию создается непрерывное (psSolid) черное перо шириной в один пиксел. Свойства класса приведены в таблице:
-----------------------------------------------------------------
Handle |
Содержит дескриптор пера. |
|
|
||
Color |
Определяет цвет пера. |
|
|
||
Mode |
Содержит |
идентификатор одной |
из |
||
|
растровых |
|
операций, |
которые |
|
|
определяют взаимодействие пера |
с |
|||
|
поверхностью. |
Эти |
операции |
||
|
соответствуют |
стандартным, |
|||
|
определенным в Windows |
|
|
||
Style |
Определяет стиль линии, |
рисуемой |
|||
|
пером. |
Соответствующие |
стили |
||
|
также определены в Windows |
Width |
Содержит значение толщины пера в |
|
пикселах |
-----------------------------------------------------------------
Класс TBrush
Инкапсулирует кисть. Первоначально создается белая сплошная (bsSolid) кисть. Свойства класса приведены в таблице:
-----------------------------------------------------------------
Handle |
Содержит дескриптор кисти. |
|
||
Color |
Определяет цвет кисти. |
|
|
|
Style |
Содержит |
стиль кисти |
(фактуру |
|
|
закраски). |
|
|
|
Bitmap |
Содержит |
битовую |
карту, |
|
|
определенную пользователем |
для |
||
|
закраски поверхностей. Если это |
|||
|
свойство определено, то |
Color |
и |
|
|
Style недействительны |
|
|
|
-----------------------------------------------------------------
Шрифт, перо и кисть, как правило, используются не самостоятельно, а в составе специального класса, который и будет сейчас рассмотрен.
Класс TCanvas
Этот класс - сердцевина графической подсистемы Borland C++ Builder. Он объединяет в себе и "холст" (контекст конкретного устройства GDI), и рабочие инструменты" (перо, кисть, шрифт) и даже "подмастерьев" (набор функций по рисованию типовых геометрических фигур).
В дальнейшем для обозначения этого класса мы будем пользоваться термином 'канва". Канва не является компонентом, но она входит в качестве свойства во многие другие компоненты, которые должны уметь нарисовать себя и отобразить какую-либо информацию. Дескриптор контекста устройства, над которым "построена" канва, может быть востребован для различных низкоуровневых операций. Он задается свойством:
__property HDC Handle = {read =GetHandle, write=SetHandle, nodefault};
Для рисования канва включает в себя шрифт, перо и кисть:
__property TFont* Font = {read=FFont, write=SetFont}; __property TPen* Pen = {read=FPen, write =SetPen}; __property TBrush* Brush = {read=FBrush, write=SetBrush};
Кроме того, можно рисовать и поточечно, получив доступ к каждому пикселу. Значение свойства
__property TColor Pixels[int X][int Y] = {read=GetPixel, write=SetPixel};
соответствует цвету точки с координатами (X,Y).
Канва содержит методы-надстройки над всеми основными функциями рисования GDI Windows и свойства, которые приведены ниже в таблице. При их рассмотрении имейте в виду, что все геометрические фигуры рисуются текущим пером. Те из них, которые можно зак-
13
рашивать, закрашиваются с помощью текущей кисти. Кисть и перо при этом имеют текущий цвет.
------------------------------------------------------------------
void |
__fastcall Arc(int X1, |
int¦Метод |
рисует сегмент |
эллипса. |
||||||||||
Y1, int X2, int Y2, int X3, |
int¦Эллипс |
определяется описывающим |
||||||||||||
Y3, int X4, int Y4); |
|
¦прямоугольником |
(X1,Y1) |
- |
||||||||||
|
|
|
|
|
¦(X2,Y2); |
его |
|
размеры |
должны |
|||||
|
|
|
|
|
¦лежать в диапазоне от 2 до 32767 |
|||||||||
|
|
|
|
|
¦точек. Начальная точка |
сегмента |
||||||||
|
|
|
|
|
¦лежит на |
пересечении эллипса |
и |
|||||||
|
|
|
|
|
¦луча, проведенного из его центра |
|||||||||
|
|
|
|
|
¦через |
точку |
(X3,Y3). Конечная |
|||||||
|
|
|
|
|
¦точка |
сегмента |
|
лежит |
|
на |
||||
|
|
|
|
|
¦пересечении |
|
эллипса |
|
и |
луча, |
||||
|
|
|
|
|
¦проведенного из его центра через |
|||||||||
|
|
|
|
|
¦точку (X4,Y4). Сегмент |
рисуется |
||||||||
|
|
|
|
|
¦против часовой стрелки. |
|
|
|
||||||
void |
__fastcall |
Chord(int |
X1,¦Рисует |
хорду |
и |
|
заливает |
|||||||
int |
Y1, int X2, int Y2, int |
X3,¦отсекаемую |
ею |
часть |
|
эллипса. |
||||||||
int Y3, int X4, int Y4); |
|
¦Эллипс, |
начальная |
и |
конечная |
|||||||||
|
|
|
|
|
¦точки определяются, как в методе |
|||||||||
|
|
|
|
|
¦Arc. |
|
|
|
|
|
|
|
|
|
void |
__fastcall Ellipse(int |
X1,¦Рисует |
и |
закрашивает |
эллипс, |
|||||||||
int Y1, int X2, int Y2); |
|
¦вписанный в прямоугольник (X1 |
||||||||||||
|
|
|
|
|
¦,Y1) - (X2,Y2). |
|
|
|
|
|
||||
void |
__fastcall |
LineTo(int |
X,¦Проводит |
линию текущим пером из |
||||||||||
int Y); |
|
|
|
¦текущей точки в (X,Y). |
|
|
|
|||||||
void |
__fastcall |
MoveTo(int |
X,¦Перемещает |
текущее |
|
положение |
||||||||
int Y); |
|
|
|
¦пера |
(свойство PenPos) в |
точку |
||||||||
|
|
|
|
|
¦(X,Y). |
|
|
|
|
|
|
|
|
|
void __fastcall BrushCopy(const¦Производит |
|
|
|
специальное |
||||||||||
Windows::TRect &Dest, |
TBitmap*¦копирование. |
|
|
Прямоугольник |
||||||||||
Bitmap, |
const |
Windows::TRect¦Source |
из битовой карты |
Bitmap |
||||||||||
&Source, TColor Color); |
|
¦копируется в прямоугольник Dest |
||||||||||||
|
|
|
|
|
¦на |
канве; |
при этом |
цвет Color |
||||||
|
|
|
|
|
¦заменяется на цвет текущей кисти |
|||||||||
|
|
|
|
|
¦(Brush->Color). С |
помощью этого |
||||||||
|
|
|
|
|
¦метода |
|
можно |
|
нарисовать |
|||||
|
|
|
|
|
¦"прозрачную" картинку. Для этого |
|||||||||
|
|
|
|
|
¦нужно выбрать |
|
соответствующий |
|||||||
|
|
|
|
|
¦фону цвет кисти и затем заменить |
|||||||||
|
|
|
|
|
¦на |
него |
фоновый |
или |
наиболее |
|||||
|
|
|
|
|
¦часто встречающийся цвет битовой |
|||||||||
|
|
|
|
|
¦карты (см. TransparentColor). |
|
||||||||
void |
__fastcall |
CopyRect(const¦Производит |
|
|
|
копирование |
||||||||
Windows:: |
TRect &Dest, |
TCanvas*¦прямоугольника Source |
|
из |
канвы |
|||||||||
Canvas, |
const |
Windows::TRect¦Canvas |
в прямоугольник |
Dest |
в |
|||||||||
&Source); |
|
|
|
¦области самого объекта. |
|
|
|
|||||||
void |
__fastcall |
FillRect(const¦Производит |
|
|
|
|
заливку |
|||||||
Windows:: TRect &Rect); |
|
¦прямоугольника (текущей кистью). |
||||||||||||
void __fastcall FrameRect(const¦Производит, |
|
|
оконтуривание |
|||||||||||
Windows:: TRect &Rect); |
|
¦прямоугольника |
цветом |
текущей |
||||||||||
|
|
|
|
|
¦кисти (без заполнения). |
|
|
|
||||||
void |
__fastcall Draw(int X, |
int¦Осуществляет |
|
|
|
|
рисование |
|||||||
Y, TGraphic* Graphic); |
|
¦графического |
|
объекта |
|
Graphic |
||||||||
|
|
|
|
|
¦(точнее, |
вызов |
метода |
|
его |
|||||
|
|
|
|
|
¦рисования) в области |
с |
верхним |
|||||||
|
|
|
|
|
¦левым углом (X,Y). |
|
|
|
|
|||||
void __fastcall |
|
|
¦Осуществляет рисование |
объекта |
||||||||||
StretchDraw(const Windows::TRect ¦Graphic |
|
|
в |
|
|
заданном |
||||||||
&Rect, TGraphic* Graphic); |
¦прямоугольнике |
Rect. |
|
Если |
|||||||||
|
|
|
|
|
|
¦размеры их не совпадают, Graphic |
|||||||
|
|
|
|
|
|
¦масштабируется. |
|
|
|
|
|||
void |
|
|
|
|
__fastcall¦Производит |
|
|
отрисовку |
|||||
DrawFocusRect(const |
|
¦прямоугольной рамки |
из |
точек |
|||||||||
Windows::TRect &Rect); |
¦(как |
на элементе, имеющем фокус |
|||||||||||
|
|
|
|
|
|
¦ввода). |
|
Поскольку |
метод |
||||
|
|
|
|
|
|
¦использует логическую |
операцию |
||||||
|
|
|
|
|
|
¦xor (исключающее ИЛИ), повторный |
|||||||
|
|
|
|
|
|
¦вызов для того же прямоугольника |
|||||||
|
|
|
|
|
|
¦приводит |
изображение |
|
к |
||||
|
|
|
|
|
|
¦начальному виду. |
|
|
|
|
|||
void __fastcall FloodFill(int |
X,¦Производит |
заливку |
области |
||||||||||
int |
Y, |
TColor Color, TFillStyle¦текущей |
|
кистью. |
|
Процесс |
|||||||
FillStyle); |
|
|
|
¦начинается |
с точки |
(X,Y). Если |
|||||||
|
|
|
|
|
|
¦режим FillStyle равен fsSurface, |
|||||||
|
|
|
|
|
|
¦то |
он продолжается до тех |
пор, |
|||||
|
|
|
|
|
|
¦пока |
есть |
соседние |
точки |
с |
|||
|
|
|
|
|
|
¦цветом Color. В режиме |
fsBorder |
||||||
|
|
|
|
|
|
¦закрашивание, |
|
наоборот, |
|||||
|
|
|
|
|
|
¦прекращается |
при |
|
выходе |
на |
|||
|
|
|
|
|
|
¦границу с цветом Color. |
|
|
|||||
void |
__fastcall Pie(int X1, |
int¦Рисует |
|
сектор |
|
эллипса, |
|||||||
Y1, |
int X2, int Y2, int X3, |
int¦описываемого |
прямоугольником |
||||||||||
Y3, int X4, int Y4); |
|
¦(X1,Y1) |
- |
(X2,Y2). |
Стороны |
||||||||
|
|
|
|
|
|
¦сектора |
лежат |
на |
лучах, |
||||
|
|
|
|
|
|
¦проходящих |
из центра |
эллипса |
|||||
|
|
|
|
|
|
¦через точки (X3,Y3) и (X4,Y4). |
|||||||
void __fastcall Polygon(const¦Строит |
многоугольник, используя |
||||||||||||
tagPOINT |
* |
Points, |
const |
int¦массив |
координат точек |
Points. |
|||||||
Points_Size); |
|
|
|
¦При |
|
этом |
последняя |
точка |
|||||
|
|
|
|
|
|
¦соединяется |
с |
|
первой |
и |
|||
|
|
|
|
|
|
¦внутренняя область закрашивается |
|||||||
void |
__fastcall |
Polyline(const¦Строит |
ломаную линию, используя |
||||||||||
tagPOINT |
* |
Points, |
const |
int¦массив координат точек Points. |
|||||||||
Points_Size); |
|
|
|
¦ |
|
|
|
|
|
|
|
||
void |
__fastcall |
|
Rectangle(int¦Рисует |
прямоугольник с верхним |
|||||||||
X1, int Y1, int X2, int Y2); |
¦левым |
углом в (X1, Y1) и нижним |
|||||||||||
|
|
|
|
|
|
¦правым в (X2, Y2). |
|
|
|
|
|||
void |
__fastcall |
|
RoundRect(int¦Рисует |
|
прямоугольник |
с |
|||||||
X1, int Y1, int X2, int Y2, |
int¦закругленными углами. Координаты |
||||||||||||
X3, int Y3); |
|
|
|
¦вершин - те же, что и в |
методе |
||||||||
|
|
|
|
|
|
¦Rectangle. Закругления |
рисуются |
||||||
|
|
|
|
|
|
¦как сегменты эллипса с размерами |
|||||||
|
|
|
|
|
|
¦осей по |
горизонтали и вертикали |
||||||
|
|
|
|
|
|
¦X3 и Y3. |
|
|
|
|
|
||
int |
__fastcall |
TextHeight(const¦Возвращает высоту строки |
Text в |
||||||||||
System:: AnsiString Text); |
¦пикселах. |
|
|
|
|
|
|||||||
int |
__fastcall |
TextWidth(const¦Возвращает ширину строки |
Text в |
||||||||||
System:: AnsiString Text); |
¦пикселах. |
|
|
|
|
|
|||||||
void |
__fastcall |
TextOut(int |
X,¦Производит вывод строки Text. |
||||||||||
int |
Y, |
const System::AnsiString¦Левый |
верхний угол помещается в |
||||||||||
Text); |
|
|
|
|
¦точку канвы (X.Y). |
|
|
|
|
||||
void |
__fastcall |
TextRect(const¦Производит |
вывод |
|
текста |
с |
|||||||
Windows:: |
TRect |
&Rect, int |
X,¦отсечением. Как и в |
TextOut, |
|||||||||
int |
Y, |
const System::AnsiString¦строка |
Text выводится с позиции |
||||||||||
Text); |
|
|
|
|
¦(X,Y); |
при |
этом |
часть текста, |
|||||
|
|
|
|
|
|
¦лежащая |
|
вне |
|
|
пределов |
||
|
|
|
|
|
|
¦прямоугольника Rect, |
отсекается |
||||||
|
|
|
|
|
|
¦и не будет видна. |
|
|
|
|
|||
14
__property tagPOINT |
PenPos =¦Содержит |
текущую |
позицию пера |
{read |
=GetPenPos,¦канвы |
(изменяется |
посредством |
write=SetPenPos}; |
¦метода MoveTo). |
|
|
-----------------------------------------------------------------
Метод
void __fastcall Refresh(void);
сбрасывает текущие шрифт, перо и кисть, заменяя их на стандарт-
ные, заимствованные из Windows (BLACK_PEN, HOLLOW_BRUSH, SYS-
TEM_FONT). Предусмотрено два события дня пользовательской реакции на изменение канвы: OnChange и OnChanging . Эти события возникают при изменениях свойств и вызовах методов TCanvas, меняющих вид канвы (то есть при любом рисовании. В MoveTo, например, они не возникают). Отличие их в том, что OnChanging вызывается до начала изменений, a OnChange - после их завершения.
Идентификатор (код) растровой операции при копировании прямоугольных блоков содержится в свойстве CopyMode и определяет правило сочетания пикселов, копируемых на канву, с ее текущим содержимым. При этом можно создавать разные изобразительные эффекты. В Borland C++ Builder определены следующие константы кодов: cmBlackness, cmDstInvert. cmMergeCopy, cmMergePaint, cmNotSrcCopy, cmNotSrcErase, cmPatCopy, cmPatInvert, cmPatPaint, cmSrcAnd, cmSrcCopy, cmSrcErase, cmSrcInvert, cmSrcPaint, cmWhiteness. Все они стандартно определены в Windows, и подробное их описание можно найти в документации по GDI. Значением CopyMode по умолчанию является cmSrcCopy - копирование пикселов источника поверх существующих.
Помимо графических примитивов, таких как линии и фигуры, на канве можно разместить готовые изображения. Для их описания создан класс TGraphic. Этот абстрактный класс является родительским для трех видов изображений, общепринятых в графике Windows - значка (класс TIcon), метафайла (класс TMetafile) и растровой картинки (класс TBitmap).
Работая над приложением в Borland C++ Builder, вы никогда не будете создавать объекты класса TGraphic, но переменной этого типа вы можете присваивать указатель на любой из классов-потомков.
Метод
virtual void __fastcall Assign(Classes:: TPersistent* Source);
переопределяет одноименный метод предка, позволяя полиморфное присваивание графических объектов (см. ниже).
Загрузку и выгрузку графики в поток осуществляют методы
virtual void __fastcall LoadFromStream(Classes:: TStream* Stream); virtual void __fastcall SaveToStream(Classes::TStream* Stream);
а загрузку и выгрузку в файл:
virtual void __fastcall LoadFromFile(const System:: AnsiString Filename);
virtual void __fastcall SaveToFile(const System:: AnsiString Filename);
Эти методы создают соответствующий файловый поток и затем вызывают методы LoadFromStream / SaveToStream.
Два метода осуществляют взаимодействие с буфером обмена: virtual void __fastcall LoadFromClipboardFormat(Word AFormat,
int AData, HPALETTE APalette);
virtual void __fastcall SaveToClipboardFormat(Word &Format,
int &Data, HPALETTE &APalette);
Здесь AFormat - используемый графический формат; AData и APalette - данные и палитра (если она требуется). Потомок должен иметь свой формат и уметь обрабатывать данные, представленные в нем. Свойство Empty устанавливается в true, если графический объект пуст (в него не загружались данные).
Высота и ширина графического объекта: Height, Width. Для каждого дочернего типа значения этих свойств вычисляются своим способом. Наконец, логическое свойство Modified показывает, модифицировался ли данный графический объект. Это свойство устанавливается в true внутри обработчика события OnChange.
Класс TPicture
Класс-надстройка над TGraphic, точнее - над его потомками. Он содержит поле Graphic, которое может содержать TBitmap, TIcon
иTMetafile. Предназначение TPicture - управлять вызовами соответствующих методов, скрывая при этом хлопоты с определением типа
идетали их реализации.
Кроме того, на уровне TPicture определены возможности по регистрации и использованию других - определенных пользователем - классов графических объектов, порожденных от TGraphic. Доступ к графическому объекту осуществляется посредством свойства: Graphic. Если графический объект имеет один из трех предопределенных типов, то к нему можно обратиться и как к одному из свойств Bitmap, Icon или Metafile.
Если в поле Graphic хранился объект одного класса, а затребован - другого, то прежний объект уничтожается, а вместо него создается пустой объект нужного класса.
Все три разновидности графических объектов имеют свои системы кэширования. Это означает, что на один реально существующий в системе дескриптор могут одновременно ссылаться несколько объектов. Более простым является кэширование для TIcon и TMetafile, которые умеют только отображать себя и не предназначены для редактирования (создатели Borland C++ Builder считают, что дескриптор графического объекта дается программисту не для того, чтобы ковыряться в нем на уровне двоичных кодов). Гораздо сложнее устроен механизм кэширования для TBitmap, который имеет свою канву для рисования.
Внутреннее представление информации в графических объектах двоякое - она может храниться как поток типа TMemoryStream (в него загружается содержимое соответствующего файла), как область памяти с дескриптором (структура которой зависит от типа графического объекта) и одновременно в двух этих видах, содержимое которых автоматически синхронизируется. Поэтому будьте готовы к тому, что загрузка изображения потребует вдвое большего объема памяти - особенно это актуально для больших картинок.
Кого-то может удивить отсутствие объявленных методов рисова-
ния вроде Draw у TIcon, TMetafile и TBitmap. Такие методы есть,
но они недоступны. Все рисование должно осуществляться через вызовы методов Draw и StretchDraw канвы, содержащей графику, ибо канва несет тот контекст, в котором должна осуществляться операция. Рассмотрим предопределенные графические классы.
Класс TMetaflle
Инкапсулирует свойства стандартного метафайла Windows. В нем перекрываются методы Assign, LoadFromStream, SaveToStream, LoadFromClipboardFormat, SaveToClipboardFormat. В буфер обмена объект помещает свое содержимое в формате CF_METAFILEPICT. Помимо общих, класс имеет свойства:
15