代码之家  ›  专栏  ›  技术社区  ›  Himadri

timage和tscrollbox有问题

  •  1
  • Himadri  · 技术社区  · 16 年前

    我和德尔菲一起工作。
    我有一个滚动框,我在其中设置Timage控件。现在我想将渲染的图像缩放到timage control。所以,我使用了TCANVAS的拉伸绘制方法。我的代码是——

       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.
    谢谢您。

    3 回复  |  直到 16 年前
        1
  •  1
  •   Cosmin Prund    16 年前

    拉贝给了你正确的方法。这就是为什么你的方法不起作用:一个滚动框将显示滚动条并帮助你看到整个控件。在您的例子中,只有当timage对象比scrollbox大时,它才会显示滚动条。滚动框不可能知道timage的内部,所以它不关心timage。图片,它只关心控件。而autosize=false的timage并不关心它的图片,它的大小在任何时候都保持不变。

    您的代码将基本位图重新绘制到自身上。问题是,位图的宽度和高度是固定的:如果在位图区域之外绘制,则基本上会被忽略。当您通过拉伸将位图绘制到自身上来“缩放”时(我很惊讶它能从开始工作!)你不会让位图变大,不合适的东西会被自动剪切掉。如果您确实希望内部位图更改大小,那么首先需要创建一个新的更大的位图,将放大的图像绘制到新位图,然后将该位图分配给您的图像。如果这样做,请确保timage.autosize=true。

        2
  •  3
  •   Uwe Raabe    16 年前

    您可以很容易地做到这一点,而无需调用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;
    

    自动调整大小:=true确保图像大小与内部图片大小相同。在缩放过程中,我们关闭自动调整大小并打开拉伸,这样图片的大小就会调整到timage大小(这里仍然是相同的)。然后我们将计时的大小增加一倍以产生缩放效果。随着时间的增加,滚动框可以正常工作。

        3
  •  0
  •   Ritsaert Hornstra    16 年前

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

    推荐文章