【问题标题】:Resize Form while keeping aspect ratio在保持纵横比的同时调整表格大小
【发布时间】:2011-09-10 01:55:12
【问题描述】:

我有一个窗口,我在其中显示一张图片。我希望用户能够调整此窗口的大小,但是 保持与图像相同的纵横比,因此窗口上不会出现大的空白区域。

我在 OnResize 事件中尝试的是这样的:

DragWidth := Width;
DragHeight := Height;

//Calculate corresponding size with aspect ratio
//...
//Calculated values are now in CalcWidth and CalcHeight

Width := CalcWidth;
Height := CalcHeight;

这样做的问题是,在原始调整大小和计算出的调整大小之间拖动调整大小时,窗口会闪烁,因为 OnResize 事件是在调整大小完成(并绘制一次)之后调用的。

您知道平滑纵横比调整大小的任何解决方案吗?

感谢您的帮助。

【问题讨论】:

    标签: delphi events forms


    【解决方案1】:

    最近的 delphi 有 OnCanResize 事件,可以让你做到这一点。您可以直接从事件中返回计算得到的 NewWidth 和 NewHeight。

    【讨论】:

      【解决方案2】:

      为 OnCanResize 事件添加以下处理程序对我来说似乎效果很好:

      procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
        NewHeight: Integer; var Resize: Boolean);
      var
        AspectRatio:double;
      begin
        AspectRatio:=Height/Width;
        NewHeight:=round(AspectRatio*NewWidth);
      end;
      

      您当然可能想要更改计算 NewHeight 和 NewWidth 的方法。当我在空白表单上尝试以下方法时,直觉上感觉“正确”:

        NewHeight:=round(0.5*(NewHeight+AspectRatio*NewWidth));
        NewWidth:=round(NewHeight/AspectRatio);
      

      【讨论】:

      • 您可能已经弄清楚了,但对于其他感兴趣的人,我建议保持 ClientWidth 和 ClientHeight 的纵横比不变,而不是我上面的做法。这当然会稍微复杂一些。
      • 你能解释一下如何应用这个方法,我对 Delphi 很陌生,我很困惑如何在 OnCanResize 事件上设置这个处理程序。你能给我一个例子吗 ?高度赞赏。谢谢
      • 在设计窗口中选择表单,找到左侧的事件选项卡,找到OnCanResize并双击OnCanResize文本右侧的白色单元格。 (使用 Delphi 2009)
      • 感谢您的信息,不小心我已经想通了。我现在的问题是,如何检查窗口是否被最小化,因为如果是这样,表单将不会转到任务栏,而是会执行此操作:i.imgur.com/rVhci.png 我正在谷歌搜索如何修复它但是.. 不成功到现在为止。
      • 这是一个完全不同的问题,您不太可能在此处的评论中得到好的答案。
      猜你喜欢
      • 2014-01-08
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      • 2013-06-26
      相关资源
      最近更新 更多