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

При создании сложных графических изображений следует избегать их непосредственного рисования на канве формы или компоненты, представленной в экранном окне вашего приложения. Вместо этого вы сможете сконструировать некий объект битового образа и рисовать на его канве, а затем скопировать изображение на канву экрана. При рисовании на канве внеэкранного битового образа наиболее часто используется метод 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()) ;

}