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

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

DragWidth := Width;
DragHeight := Height;

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

Width := CalcWidth;
Height := CalcHeight;

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

您知道有什么解决方案可以实现平滑的宽高比调整吗?

谢谢你的帮助。

最佳答案

为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);

10-06 08:45