Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Копиование Canvas с помощью BitBlt не то, что ожидалось ...

3.2K
14 апреля 2008 года
nikipelovav
152 / / 12.04.2006
Работаю с двумя TPaintBox. Один MemoNV отображаю на форме, другой MemoNV2 нет. На MemoNV2 рисую, а на MemoNV копирую готовый образ с помощью BitBlt.
Результат - вижу копию экрана.

Вопрос: ШО происходит?

Код:
// где-то там ... создаю PaintBox-ы
  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 ).
8.4K
14 апреля 2008 года
Zor
104 / / 23.04.2006
Мдя. Вообще то tpaintbox не способен хранить какую либо картинку, так как предназначен только показывать что либо.
для внеэкранной подготовки изображений используйте tbitmap
3.2K
14 апреля 2008 года
nikipelovav
152 / / 12.04.2006
Цитата: Zor
Мдя. Вообще то tpaintbox не способен хранить какую либо картинку, так как предназначен только показывать что либо.
для внеэкранной подготовки изображений используйте 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 красками ... :)

8.4K
14 апреля 2008 года
Zor
104 / / 23.04.2006
"TPaintBox requires an application to draw the image directly on a canvas"
=
каждый раз когда нужно нарисовать изображение, система запрашивает программу перерисовать PaintBox (как телевизор - показывает, но не хранит :) так понятно?)
3.2K
14 апреля 2008 года
nikipelovav
152 / / 12.04.2006
Цитата: Zor
"TPaintBox requires an application to draw the image directly on a canvas"
=
каждый раз когда нужно нарисовать изображение, система запрашивает программу перерисовать PaintBox (как телевизор - показывает, но не хранит :) так понятно?)



Пока не понятно :) . То что для TPaintBox картинка рисуется в OnPaint, а не грузится из образа файла, как у TImage, это понятно. Какая разница, с точки зрения результата? Вот в чём квэшшен :)! Ведь и у TImage и у TPaintBox и у TBitmap - полотно для изображения одно и тоже - Canvas!

Но, горькая правда в том, что замена TPaintBox на Graphics::TBitmap помогла! Спасибо.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог