首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TImage和TScrollBox的问题

TImage和TScrollBox的问题
EN

Stack Overflow用户
提问于 2010-06-23 14:29:06
回答 3查看 3.3K关注 0票数 1

我正在和delphi一起工作。

我有一个滚动框,在其中我放置了TImage控件。现在我想缩放渲染到TImage控件中的图像。所以,我使用的是TCanvas的stretchDraw方法。我的代码是-

代码语言:javascript
复制
   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.

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-23 19:04:25

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

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

票数 1
EN

Stack Overflow用户

发布于 2010-06-23 16:10:46

您可以很容易地完成此操作,而无需调用StretchDraw:

代码语言:javascript
复制
  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现在变大了,滚动框可以正常工作。

票数 3
EN

Stack Overflow用户

发布于 2010-06-23 15:03:45

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3099368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档