调整图像大小会使鼠标X / Y失真

时间:2013-05-22 21:52:45

标签: delphi drawing scale

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

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

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

的MouseDown:

Drawing := true;

StartX := x;
StartY := y;

EndX := x;
EndY := y;

的MouseMove:

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;

的MouseUp:

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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