如何获得窗口原始大小和位置(wsNormal vs wsMaximized)

Gab*_*elF 5 windows delphi winapi

我希望存储窗口大小和位置的用户个性化,以便在重新打开应用程序时使用它.这实际上很简单,我有以下代码工作:

在OnCreate:

Width := wIni.ReadInteger('FORM', 'FORMW', 980);
Height := wIni.ReadInteger('FORM', 'FORMH', 500);
PnlXMLI.Width := wIni.ReadInteger('FORM', 'PNLXMLIW', 500);
WindowState := TWindowState(GetEnumValue(TypeInfo(TWindowState), wIni.ReadString('FORM', 'WINDOWSTATE', 'wsNormal')));
Run Code Online (Sandbox Code Playgroud)

的OnDestroy:

wIni.WriteInteger('FORM', 'FORMW', Width);
wIni.WriteInteger('FORM', 'FORMH', Height);
wIni.WriteInteger('FORM', 'PNLXMLIW', PnlXMLI.Width);
wIni.WriteString('FORM', 'WINDOWSTATE', GetEnumName(TypeInfo(TWindowState), Ord(WindowState)));
Run Code Online (Sandbox Code Playgroud)

问题是当用户最大化窗口然后恢复它时,它会恢复到最大化之前的大小.但是如果他最大化,然后关闭并重新打开应用程序并恢复它,应用程序将不会在最大化之前恢复到原始大小.它将是屏幕大小,因为宽度和高度属性在读取时提供最大化的大小.

问题是:如何获得窗口的原始大小,即用户恢复窗口时将返回的大小?我尝试在读取宽度和高度之前将WindowState设置为wsNormal,但它不起作用(可能是因为表单被销毁?)...而且我宁愿使用不做不必要的GUI操作的解决方案(源代码美学原因).

提前致谢.

Dav*_*nan 8

您需要的功能是GetWindowPlacementSetWindowPlacement.这些操作在WINDOWPLACEMENT结构上.该结构具有如下记录的rcNormalPosition成员:

窗口处于恢复位置时的窗口坐标.

当您保存窗口位置和大小时,您需要保存找到的值rcNormalPosition.在相反的方向上,当恢复窗口位置和大小时,您必须调用SetWindowPlacement传递作为rcNormalPosition存储在INI文件中的用户首选项中的值.