Перетаскивание TPaintBox с сохранением статического содержимого

У нас есть VCL TPaintBox, на котором мы отображаем видео. Его родителем является TScrollbox.

При масштабировании PaintBox становится больше, чем полоса прокрутки, поэтому части изображения скрыты.

Мы реализовали возможность перетаскивания области рисования с помощью мыши внутри полосы прокрутки, которая работает нормально.

Однако всякий раз, когда объект paintBox перемещается, т. е. изменяется его свойство left или top, его содержимое стирается.

Вопрос в том, есть ли способ предотвратить стирание содержимого коробки с краской при ее перемещении?

Я создал простой пример VCL Forms с полем для рисования внутри поля прокрутки, код ниже. При нажатии на клавиатуру на поле краски рисуется линия.

Пример показывает, что без постоянной отрисовки содержимое коробки с краской стирается при перемещении самой себя. Вопрос в том, как избежать или бороться?

      #ifndef Unit1H
#define Unit1H
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include "RzButton.hpp"

class TForm1 : public TForm
{
    __published:
        TPaintBox *PB;
        TScrollBox *ScrollBox1;
        void __fastcall ObjMouseDown(TObject *Sender, TMouseButton     Button, TShiftState Shift, int X, int Y);
        void __fastcall ObjMouseMove(TObject *Sender, TShiftState Shift, int X, int Y);
        void __fastcall ObjMouseUp(TObject *Sender, TMouseButton Button,  TShiftState Shift, int X, int Y);
        void __fastcall PBPaint(TObject *Sender);
        void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);

    public:
        __fastcall TForm1(TComponent* Owner);

        bool mIsDragging;
        TPoint mMouseDownLocation;
        TPoint mDragStartingLocation;
};
extern PACKAGE TForm1 *Form1;
#endif

и источник

      #include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "RzButton"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{}
//---------------------------------------------------------------------------
void __fastcall TForm1::ObjMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
      int X, int Y)
{
    mIsDragging = true;
    mMouseDownLocation = Mouse->CursorPos;
    mDragStartingLocation = TPoint(PB->Left, PB->Top);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::ObjMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
     if(mIsDragging)
     {
        PB->Left = mDragStartingLocation.X + (Mouse->CursorPos.X - mMouseDownLocation.X);
        PB->Top = mDragStartingLocation.Y  + (Mouse->CursorPos.Y - mMouseDownLocation.Y);
     }
}

//---------------------------------------------------------------------------
void __fastcall TForm1::ObjMouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
     mIsDragging = false;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::PBPaint(TObject *Sender)
{
//    PB->Canvas->Pen->Color = clRed;
//    PB->Canvas->Pen->Width = 3;
//    PB->Canvas->MoveTo(50,50);
//    PB->Canvas->LineTo(150, 150);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
  PB->Canvas->Pen->Color = clRed;
  PB->Canvas->Pen->Width = 3;
  PB->Canvas->MoveTo(50,50);
  PB->Canvas->LineTo(150, 150);
}

0 ответов

Другие вопросы по тегам