【发布时间】:2011-05-22 17:16:04
【问题描述】:
我从来不知道,但显然:
默认情况下,系统会减少一个 最小化窗口到它的大小 任务栏按钮并移动最小化的 窗口到任务栏。一个恢复的 window 是一个已经被 恢复到以前的大小和 位置,即它的大小 在它被最小化或最大化之前。
在应用程序中,我们希望在退出时保存各种窗口的位置/大小。这会导致最小化窗口的问题。我们的解决方案是在运行保存状态逻辑之前恢复所有窗口,但这看起来很老套。有没有更好的办法?
【问题讨论】:
标签: winapi
我从来不知道,但显然:
默认情况下,系统会减少一个 最小化窗口到它的大小 任务栏按钮并移动最小化的 窗口到任务栏。一个恢复的 window 是一个已经被 恢复到以前的大小和 位置,即它的大小 在它被最小化或最大化之前。
在应用程序中,我们希望在退出时保存各种窗口的位置/大小。这会导致最小化窗口的问题。我们的解决方案是在运行保存状态逻辑之前恢复所有窗口,但这看起来很老套。有没有更好的办法?
【问题讨论】:
标签: winapi
使用GetWindowPlacement怎么样?
这会返回一个WINDOWPLACEMENT structure,其中包含有关窗口在恢复位置的坐标信息。
请记住(正如 Leo Davidson 在 cmets 中指出的那样)您必须尊重工作空间和屏幕坐标之间的差异。正如WINDOWPLACEMENT 文档解释的那样:
a 中使用的坐标 WINDOWPLACEMENT 结构应该是 仅由 GetWindowPlacement 使用 和 SetWindowPlacement 函数。 将工作区坐标传递给 期望屏幕的功能 坐标(如 SetWindowPos) 将导致窗口出现在 错误的位置。例如,如果 任务栏位于顶部 屏幕,保存窗口坐标 使用 GetWindowPlacement 和恢复 他们使用 SetWindowPos 导致 窗口似乎“爬行”了 屏幕。
或者,我之前毫无疑问使用过的更简单的解决方案是在保存状态之前检查窗口是否最小化,如果是,则跳过保存任何状态信息。
至于解释为什么窗口在最小化时会改变其大小,主题上的Raymond Chen's blog entry(以及链接条目)是必读的。它们并没有真正改变其任务栏按钮的大小,而是改变为 160x31 的预定义大小。他解释说,您可以通过将 MDI 子窗口最小化到其父窗口来看到这一点——这实际上是它的大小。
【讨论】:
处理 WM_SIZE 消息。如果 wParam 不是 SIZE_MAXIMIZED 或 SIZE_MINIMIZED,则在某些变量中保留窗口大小和位置。关闭窗口时使用这些变量。
【讨论】: