Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Графические компоненты 7.doc
Скачиваний:
2
Добавлен:
08.07.2019
Размер:
100.86 Кб
Скачать

7.4 Внеэкранные битовые образы

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

C++Builder позволяет создавать объекты класса TBitmap в вашем приложении для представления изображении файлов и других ресурсов, которые также способны работать как внеэкранные изображения.

7.4.1 Копирование битовых образов.

C++Builder предусматривает четыре способа копирования изображении с одной канвы на другую. Выбирайте нужный метод копирования из следующей таблицы, в зависимости от результата, который необходимо получить.Требуемый результат Метод

Полное копирование графики Draw

Копирование с масштабированием StretchDraw

Копирование прямоугольного участка канвы CopyRect

Копирование с растровыми операциями BrushCopy

7.4.2 Создание и обслуживание

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

Пример рисования сложного изображения на внеэкранном битовом образе дает Индикатор (Gauge), представленный на вкладке Samples Палитры компонент. Исходные файлы Gauges.cpp и Gauges.h программного модуля компоненты TGauge можно найти в каталоге: \.. .\CBuilder\Examples\Controls\Source.

Фрагмент файла Gauges.cpp (Листинг 7.3) показывает основные операции, выполняемые компонентным методом Paint рисования на канве внеэкранного битового образа TBitmap. Сначала функция PaintBackground закрашивает прямоугольную фоновую область индикатора цветом, выбранным в свойстве Color. Затем в соответствии с заданным значением свойства Kind контур нужной формы обводится цветом свойства ForeColor и заливается цветом свойства BackColor (в нашем случае индикатора со стрелкой Kind = gkNeedle это выполняет функция PaintAsNeedle). Заключительные инструкции устанавливают свойство режима копирования канвы CopyMode, снабжают индикатор текстом (метод PaintAsText) и только затем (с помощью метода Draw) канва внеэкранного битового образа отображается на экране.

void _fastcall TGauge::Paint()

{

std::auto_ptr<Graphics::TBitmap> Thelmage

(new Graphics::TBitmap() ) ;

std::auto_ptr<TBltBitmap> Overlaylmage (new TBitBitmap());

TRect PaintTRect;

The Image->Height = Height;

TheImage->Width = Width;

PaintBackgroundtThelmage.get()) ;

PaintTRect = ClientRect;

if (FBorderStyle == bsSingle)

InflateRect(&RECT(PaintTRect), -1, -1);

OverlayImage->MakeLike(Thelmage.get() ) ;

PaintBackground(Overlay Image.get());

switch(FKind) {

case gkText:

PaintAsNothing(Overlay Image.get(), PaintTRect); break;

case gkHorizontalBar:

case gkVerticalBar:

PaintAsBar(Overlaylmage.get(), PaintTRect); break;

case gkPie:

PaintAsPie(Overlay Image.get(), PaintTRect); break;

case gkNeedle:

PaintAsNeedle(Overlaylmage.get(), PaintTRect); break;

}

The Image->Canvas->CopyMode = cmSrcInvert;

TheImage->Canvas->Draw(0, 0, Overlaylmage.get()) ;

TheImage->Canvas->CopyMode = cmSrcCopy;

if (ShowText == true)

PaintAsText(Thelmage.get(), PaintTRect);

Canvas->CopyMode = cmSrcCopy;

Canvas->Draw(0, 0, Thelmage.get()) ;

}

Листинг 7 3 Метод рисования на канве компоненты индикатора.

Рис. 7.1 показывает, что текст программы, реализующей перемещение стрелки индикатора по сигналам таймера, состоит всего из двух строк обработчика события OnTimer компоненты TTimer из вкладки System. Первая инструкция функции обработки события Timer1Timer устанавливает значение 1000 (принятое по умолчанию) для односекундного интервала времени объекта Timer1, а вторая инкрементирует значение свойства Progress объекта Gauge 1.

Рис. 7.1. Индчкппюр в виде шкалы со стрелкой (см. свойство Kind).

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