Материал: Конспект лекций по дисциплине «Компьютерная графика». Лейкин М.А

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

расширение 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

Источник: https://studfile.net/preview/16564466/