Копиование Canvas с помощью BitBlt не то, что ожидалось ...
Результат - вижу копию экрана.
Вопрос: ШО происходит?
MemoNV = new TPaintBox(FormText) ;
MemoNV->Parent = MemoBox ;
MemoNV->Align = alNone ;
MemoNV->Top = 0 ;
MemoNV->Left = 0 ;
MemoNV->OnMouseDown = OnMouseDown ;
MemoNV->OnMouseUp = OnMouseUp ;
MemoNV->OnMouseMove = OnMouseMove ;
MemoNV->OnPaint = OnPaintNV ;
MemoNV2 = new TPaintBox(FormText) ;
MemoNV2->Parent = FormText ;
MemoNV2->Align = alNone ;
MemoNV2->Top = 0 ;
MemoNV2->Left = 0 ;
MemoNV2->OnPaint = OnPaintNV2 ;
// вот пример обработчиков рисования
void __fastcall BFormShowInfo::OnPaintNV(TObject *Sender)
{
int XSrc = 0, YSrc = 0;
// перерисовать временный образ
if ( RepaintNV )
{
MemoNV2->OnPaint(MemoNV2);
RepaintNV = false;
}
// копируем временный образ в отображаемый
BitBlt( MemoNV->Canvas->Handle , 0, 0, MemoNV->Width, MemoNV->Height, MemoNV2->Canvas->Handle, XSrc, YSrc, SRCCOPY );
}
void __fastcall BFormShowInfo::OnPaintNV2(TObject *Sender)
{
TRect Rect( 1, 1, MemoNV2->Width, MemoNV2->Height);
MemoNV2->Canvas->Brush->Color = clWhite;
MemoNV2->Canvas->FillRect( Rect );
// рисуем текст
AnsiString str = "W = " + IntToStr(MemoNV->Width) + ", H = " + IntToStr(MemoNV->Height);
MemoNV2->Canvas->TextRect( Rect, Rect.Left + 44, Rect.Top + 55, str );
}
void __fastcall BFormShowInfo::RepaintNVBox ( void )
{
RepaintNV = true;
try { OnPaintNV( MemoNV ); } catch(...){}
}
метод RepaintNVBox вызывается в обработчике OnResize отображаемого PaintBox ( в примере это MemoNV ).
для внеэкранной подготовки изображений используйте tbitmap
для внеэкранной подготовки изображений используйте tbitmap
Попробую. Ну, а каже Canvas и OnPaint у TPaintBox? Это, что, миф? :)
В справке написано, мол ...
Use TPaintBox to add custom images to a form. Unlike TImage, which displays an image that is stored in a bitmap, icon, or metafile, TPaintBox requires an application to draw the image directly on a canvas. Use the OnPaint event handler to draw on the paint box’s Canvas, the drawing surface of the paint box.
... в событии OnPaint рисуете на холсте Canvas красками ... :)
=
каждый раз когда нужно нарисовать изображение, система запрашивает программу перерисовать PaintBox (как телевизор - показывает, но не хранит :) так понятно?)
=
каждый раз когда нужно нарисовать изображение, система запрашивает программу перерисовать PaintBox (как телевизор - показывает, но не хранит :) так понятно?)
Пока не понятно :) . То что для TPaintBox картинка рисуется в OnPaint, а не грузится из образа файла, как у TImage, это понятно. Какая разница, с точки зрения результата? Вот в чём квэшшен :)! Ведь и у TImage и у TPaintBox и у TBitmap - полотно для изображения одно и тоже - Canvas!
Но, горькая правда в том, что замена TPaintBox на Graphics::TBitmap помогла! Спасибо.