在Windows 7上保存和恢复Aero Snap位置



假设我有一个窗口,我想在窗口关闭时保存它的位置,并在窗口再次打开时恢复它。做这个的典型方法是调用GetWindowPlacement/SetWindowPlacement。这样可以记住位置和最大化/最小化状态。

在Windows 7中,你可以使用"Aero Snap"功能将一个窗口停靠在屏幕的一侧。我的问题是你如何保存和恢复窗口,已被"Snap",以便您可以恢复"Snap"状态。GetWindowPlacement/SetWindowPlacement不能解决这个问题(据我所知),我还没有在Windows 7中看到任何"Snap"API。

这里有一个类似的问题如何检测窗口被Windows7调整大小,但在这种情况下,似乎OP只是想要恢复位置,而不是"Snap"状态。

解决方法是调用GetWindowRect()来获得实际的窗口坐标,并将它们复制到WINDOWPLACEMENT::rcNormalPosition中的坏坐标上。

我解决这个问题的方法是重写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);
}

相关内容

  • 没有找到相关文章

最新更新