2

我有一个 VCL 表单,其中有一个TImage为所有边设置的锚点,因此当用户调整表单大小时,图像大小与新大小匹配(几乎要填充,有一些按钮)。

但是,当我调整大小时,我用于图像画布的绘图工具会出现偏差。在我调整大小之前,绘图工作正常,然后,我似乎在鼠标点击的其他位置绘图。

如何调整 a的大小TImage并参考新图像的 X/Y 以便绘图正确显示?

鼠标按下:

Drawing := true;

StartX := x;
StartY := y;

EndX := x;
EndY := y;

鼠标移动:

if Drawing then begin

   Image1.Canvas.Pen.Mode := pmNotXor;

   Image1.Canvas.MoveTo(StartX,StartY);
   Image1.Canvas.LineTo(EndX,EndY);
   Image1.Canvas.MoveTo(StartX,StartY);
   Image1.Canvas.LineTo(x,y);

end;

EndX := x;
EndY := y;

Image1.Canvas.Pen.Mode := pmCopy;

鼠标向上:

Image1.Canvas.MoveTo(StartX,StartY);
Image1.Canvas.LineTo(x,y);
Drawing := false;
4

2 回答 2

3

我猜图像的 Strech 属性设置为 true。在这种情况下,从图像创建的位图保持原来的大小。

当您第一次访问 Image1.Canvas 时,会创建一个大小为 Image1 的 TBitmap。调整 image1 的大小时,不会调整此位图大小。Strech = true 将位图渲染为当前图像大小,但位图本身是以前的大小。

每当调整 Image1 的大小时,您可以通过调整 Image1.Picture.Bitmap 来解决此问题。由于 TImage 没有 OnResize,您可以使用 TPanel 作为容器,并在其 OnResize 事件中进行调整。

于 2013-05-22T22:08:08.637 回答
1

不要将图像的画布用于绘图目的,而是使用 TPaintBox;将图形存储在私有变量中,并使用 PaintBox.Canvas.StretchDraw 在 OnPaint 中绘制它。

于 2013-05-22T23:40:22.073 回答