涉及到两个问题:如何在拖动时保持内容不变,以及如何将paintbox中的内容复制到一个bitmap中。
首先,在鼠标按下事件MouseDown中,创建一个位图bitmap,将paintbox中的图像复制到位图中。然后,在MouseMove事件中,通过复制位图的方式来让图像保持不变。最后,在MouseUp事件中,将位图销毁。以下是完整的代码示例:
var
MouseOffset: TPoint; // 移动时图像的偏移
Bitmap: TBitmap; // 复制paintbox中的内容的位图
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MouseOffset := Point(X, Y); // 获得拖动时鼠标的偏移
Bitmap := TBitmap.Create;
Bitmap.PixelFormat := pf32bit; // 使用32位像素
Bitmap.Width := PaintBox1.Width;
Bitmap.Height := PaintBox1.Height;
// 复制paintbox中的内容到位图中
Bitmap.Canvas.CopyRect(Rect(0, 0, PaintBox1.Width, PaintBox1.Height),
PaintBox1.Canvas, Rect(0, 0, PaintBox1.Width, PaintBox1.Height));
end;
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if ssLeft in Shift then
begin
PaintBox1.Left := PaintBox1.Left + (X - MouseOffset.X);
PaintBox1.Top := PaintBox1.Top + (Y - MouseOffset.Y);
// 在paintbox上复制位图
PaintBox1.Canvas.CopyRect(Rect(0, 0, PaintBox1.Width, PaintBox1.Height),
Bitmap.Canvas,
Rect(PaintBox1.Left, PaintBox1.Top, PaintBox1.Left + PaintBox1.Width,
PaintBox1.Top + PaintBox1.Height));
end;
end;
procedure TForm1