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

Posted

技术标签:

【中文标题】如何获取窗口原始大小和位置(wsNormal vs wsMaximized)【英文标题】:How to get window original size and position (wsNormal vs wsMaximized) 【发布时间】:2014-02-11 14:11:50 【问题描述】:

我希望存储用户对窗口大小和位置的个性化设置,以便在重新打开应用程序时使用它。这实际上非常简单,我可以使用以下代码:

创建时:

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

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

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

问题是:我怎样才能得到窗口的原始大小,即当用户恢复窗口时它会回到那个大小?在读取宽度和高度之前,我尝试将 WindowState 设置为 wsNormal,但它不起作用(可能是因为表单正在被破坏?)......我宁愿使用不执行不必要的 GUI 操作的解决方案(出于源代码美学原因)。

提前致谢。

【问题讨论】:

【参考方案1】:

您需要的函数是GetWindowPlacementSetWindowPlacement。这些操作在 WINDOWPLACEMENT 结构上。该结构具有rcNormalPosition 成员,其记录如下:

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

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

【讨论】:

使用 GetWindowPlacement/SetWindowPlacement 的另一个好处是,您可以轻松记住窗口是否被最大化,以及如果用户取消最大化它应该恢复到什么大小和位置。另请注意,WINDOWPLACEMENT 结构中的 rcNormalPosition 可能位于工作空间坐标中,该坐标可能与屏幕坐标略有不同。

以上是关于如何获取窗口原始大小和位置(wsNormal vs wsMaximized)的主要内容,如果未能解决你的问题,请参考以下文章

如何获取窗口标题按钮的大小和位置(最小化,恢复,关闭)

delphi中如何编程获取其它程序窗口的大小?

我们如何获得窗口的边框大小?

delphi 中运行后窗口会被人为的拉大或者缩小,问题是,如何获取变化后的窗口大小的值?

VS控件大小随窗体大小等比例放大或缩小

vs2010 如何设置MFC程序窗口大小