1

我正在与德尔福合作。
我有一个滚动框,我在其中放置 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.
谢谢你。

4

3 回答 3

3

您无需调用 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 并打开 Stretch,因此图片被调整为 TImage 大小(这里仍然相同)。然后我们将 TImage 的大小加倍来制作缩放效果。由于 TImage 现在变大了,滚动框可以正常工作。

于 2010-06-23T08:10:46.060 回答
1

Uwe Raabe 为您提供了正确的方法。这就是您的方式不起作用的原因:滚动框将显示滚动条并帮助您查看整个控件。在您的情况下,它只会在 TImage 对象变得比滚动框大时显示滚动条。Scrollbox 不可能知道 TImage 的内部结构,所以它不关心 TImage.Picture,它只关心控件。并且具有 AutoSize = False 的 TImage 并不关心它的图片,它的大小始终保持不变。

您的代码将基本位图重新绘制到自身上。问题是,位图具有固定的宽度和高度:如果您在位图区域之外进行绘制,您基本上会被默默地忽略。当您通过 StretchDrawing 将位图“缩放”到自身上时(我很惊讶它一开始就起作用了!)您并没有使位图变大,并且不适合的东西会被默默地剪掉。如果您确实希望内部位图改变大小,那么您首先需要创建一个新的更大的位图,将放大的图像绘制到新位图,然后将位图分配给您的 TImage。如果这样做,请确保 TImage.AutoSize = True。

于 2010-06-23T11:04:25.090 回答
0

您应该将图像控件的大小设置为位图的大小。

于 2010-06-23T07:03:45.347 回答