2011-06-07 134 views
7

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

我想什么是像这样在onResize受到事件:

DragWidth := Width; 
DragHeight := Height; 

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

Width := CalcWidth; 
Height := CalcHeight; 

这里的问题是,调整大小的原始大小调整大小和计算的之间拖动过程中的窗口闪烁,因为onResize受到事件调整大小已完成后调用afaik(并绘制一次)。

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

感谢您的帮助。

回答

7

添加了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); 
+2

你可能已经得到这个想通了已经,但对于其他人感兴趣的话,我会建议保持对ClientWidth和ClientHeight长宽比而不是我如何做到这一点。这当然会更复杂一点。 – boileau 2011-06-07 14:59:02

+0

你能解释一下如何应用这个方法多一点,我对Delphi很陌生,我对如何在OnCanResize事件上设置这个处理器感到困惑。你可以给我一个例子吗 ?高度赞赏。谢谢 – Eduard 2012-12-05 20:02:22

+0

在设计窗口中选择表单,找到左侧的事件选项卡,找到OnCanResize并双击OnCanResize文本右侧的白色单元格。 (使用德尔福2009) – boileau 2012-12-06 10:44:55

2

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

相关问题