我有一个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;
答案 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中绘制它。