我正在和delphi一起工作。
我有一个滚动框,在其中我放置了TImage控件。现在我想缩放渲染到TImage控件中的图像。所以,我使用的是TCanvas的stretchDraw方法。我的代码是-
if sbZoom.Down then begin
rct := imgmain.Picture.Bitmap.Canvas.ClipRect;
rct := Rect(rct.Left * 2,rct.Top * 2,rct.Right * 2,rct.Bottom * 2);
imgmain.Picture.Bitmap.Canvas.StretchDraw(rct,imgmain.Picture.Bitmap);
imgmain.Repaint;
end;这是正确的缩放图像,我的问题是我希望滚动框的大小也应该随着图像的缩放而改变。
Also explain me parameters of Canvas.StretchDraw method. I am little confused with it.
谢谢。
发布于 2010-06-23 19:04:25
Uwe Raabe给你提供了正确的方法。这就是你的方法不起作用的原因:一个滚动框将显示滚动条,并帮助你查看整个控件。在您的示例中,只有当TImage对象大于滚动框时,它才会显示滚动条。Scrollbox不可能知道TImage的内部结构,所以它不关心TImage.Picture,它只关心控件。AutoSize = False的TImage并不关心它的图片,它的大小始终保持不变。
您的代码会将基位图重新绘制到自身上。问题是,位图有固定的宽度和高度:如果你在位图的区域之外绘制,你基本上被悄悄地忽略了。当您通过StretchDrawing将位图“缩放”到自身时(我很惊讶它一开始就能正常工作!)你没有把位图放大,不合适的东西就会被悄悄地剪掉。如果您确实希望内部位图改变大小,那么您首先需要创建一个新的、更大的位图,将放大的图像绘制到新的位图,然后将该位图分配给您的TImage。如果这样做,请确保TImage.AutoSize = True。
发布于 2010-06-23 16:10:46
您可以很容易地完成此操作,而无需调用StretchDraw:
if Zoomed then begin
Image1.AutoSize := false;
Image1.Stretch := true;
Image1.Width := 2*Image1.Width;
Image1.Height := 2*Image1.Height;
end
else begin
Image1.Stretch := false;
Image1.AutoSize := true;
end;AutoSize := true可确保TImage的大小与里面的图片相同。在缩放过程中,我们关闭AutoSize并打开拉伸,因此图片被调整到TImage大小(这里仍然是一样的)。然后我们将TImage的大小加倍以实现缩放效果。由于TImage现在变大了,滚动框可以正常工作。
发布于 2010-06-23 15:03:45
应将图像控件的大小设置为位图的大小。
https://stackoverflow.com/questions/3099368
复制相似问题