假设我有一个窗口,我希望在窗口关闭时保存它的位置,并在窗口再次打开时恢复它。执行此操作的典型方法是调用GetWindowPlacement / SetWindowPlacement。这需要记住位置和最大化/最小化状态。
在Windows 7上,您可以使用"Aero Snap"功能将窗口停靠在屏幕一侧。我的问题是如何保存和恢复已被“捕捉”的窗口,以便您可以恢复“快照”状态。 GetWindowPlacement / SetWindowPlacement没有解决这个问题(据我所知),我在Windows 7中没有看到任何“Snap”API。
这里有一个类似的问题 How to detect window was resized by Windows7但在这种情况下,OP似乎只想要恢复位置,而不是“Snap”状态。
答案 0 :(得分:5)
解决方法是致电GetWindowRect()
获取实际窗口坐标,并将其复制到WINDOWPLACEMENT::rcNormalPosition
中的错误坐标上。
答案 1 :(得分:0)
我解决它的方法是覆盖 CWinAppEx::SaveState,在保存之前更新 WINDOWPLACEMENT:
BOOL MyApp:SaveState(LPCTSTR lpszSectionName, CFrameImpl *pFrameImpl)
{
WINDOWPLACEMENT wp;
wp.length = sizeof(WINDOWPLACEMENT);
m_pMainWnd->GetWindowPlacement(&wp);
if (wp.showCmd == SW_SHOWNORMAL)
{
m_pMainWnd->GetWindowRect(&wp.rcNormalPosition);
m_pMainWnd->SetWindowPlacement(&wp);
}
return __super::SaveState(lpszSectionName, pFrameImpl);
}