我有一个窗口,我在其中显示图片。我希望用户能够调整此窗口的大小,但是 保持它与图像的纵横比相同,因此窗口上不会出现大的空白区域。
我在OnResize事件中尝试的是这样的事情:
DragWidth := Width;
DragHeight := Height;
//Calculate corresponding size with aspect ratio
//...
//Calculated values are now in CalcWidth and CalcHeight
Width := CalcWidth;
Height := CalcHeight;
问题是,在原始调整大小和计算值之间调整大小时,窗口会闪烁,因为在调整大小已经完成(并绘制一次)之后调用OnResize事件。
您是否知道任何有关平滑长宽比调整的解决方案?
感谢您的帮助。
答案 0 :(得分: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);
答案 1 :(得分:2)
最近的delphi有OnCanResize事件,允许你这样做。您可以直接从事件中返回计算出的NewWidth和NewHeight。