am besten du malst in ein internes TBitmap oder TPicture objekt und blittest das dann beim neu-zeichnen (OnPaint event von TPaintBox). Hier mal nen beispiel:
Code:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TfMain = class(TForm)
btDraw: TButton;
btMvLeft: TButton;
btMvDown: TButton;
btMvRight: TButton;
btMvUp: TButton;
pPb: TPanel;
Pbox: TPaintBox;
procedure Button1Click(Sender: TObject);
procedure btDrawClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure PboxPaint(Sender: TObject);
procedure btMvDownClick(Sender: TObject);
procedure btMvLeftClick(Sender: TObject);
procedure btMvUpClick(Sender: TObject);
procedure btMvRightClick(Sender: TObject);
private
cCVS: TBitmap;
cX: Integer;
cY: Integer;
public
{ Public declarations }
end;
var
fMain: TfMain;
implementation
{$R *.dfm}
procedure TfMain.Button1Click(Sender: TObject);
begin
Pbox.Repaint;
end;
procedure TfMain.btDrawClick(Sender: TObject);
begin
cCVS.Canvas.Brush.Color:= clWhite;
cCVS.Canvas.FillRect(Rect(0,0,100,100));
cCVS.Canvas.Pen.Color:= clBlack;
cCVS.Canvas.MoveTo(0,0);
cCVS.Canvas.LineTo(100,100);
Pbox.Canvas.CopyRect(Rect(0,0,100,100),cCVS.Canvas,Rect(0,0,100,100));
end;
procedure TfMain.FormCreate(Sender: TObject);
begin
cCVS:= TBitmap.Create();
cCVS.Width:= 100;
cCVS.Height:= 100;
cX:=0;
cY:=0;
end;
procedure TfMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
cCVS.Free();
end;
procedure TfMain.PboxPaint(Sender: TObject);
begin
Pbox.Canvas.CopyRect(Rect(cX,cY,cX+100,cY+100),cCVS.Canvas,Rect(0,0,100,100));
end;
procedure TfMain.btMvDownClick(Sender: TObject);
begin
inc(cY,5);
Pbox.Invalidate;
end;
procedure TfMain.btMvLeftClick(Sender: TObject);
begin
inc(cX,5);
Pbox.Invalidate;
end;
procedure TfMain.btMvUpClick(Sender: TObject);
begin
dec(cY,5);
Pbox.Invalidate;
end;
procedure TfMain.btMvRightClick(Sender: TObject);
begin
dec(cX,5);
Pbox.Invalidate;
end;
end.