我知道这对很多人来说已经晚了,但是我发现CFrameWndEx--它将在您的CMainFrame类中 - 使用WM_CLOSE窗口来保存您的应用程序的默认位置。我不知道是什么加载的位置。但是,如果您覆盖WM_CLOSE,那么退出程序时该窗口状态永远不会保存。它会尝试重新加载你的最后一个窗口状态,但由于从来没有人保存过,所以没有什么可担心的。
GOTCHA现状: 由于框架仍然会调用某种WM_INIT函数来加载最后一个位置,如果您正常编译代码,最大化应用程序窗口,用X关闭程序,WM_CLOSE会保存应用程序状态为MAXIMIZED。如果您通过重写WM_CLOSE来重新编译应用程序,请重新启动该应用程序,您会注意到它已经开始最大化!显然不是你想要的。因此,您必须重新激活(注释掉WM_CLOSE),让程序以正常窗口关闭时通过重新启动程序来保存应用程序状态。允许重写的WM_CLOSE再次工作,您将看到正常窗口重新出现。
CODE:
在你CMainFrame.h
市民: AFX_MSG无效的OnClose();
在你CMainFrame.cpp扩大您的消息映射
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
*ON_WM_CLOSE() // <<< I ADDED THIS*
.... END_MESSAGE_MAP()
无效的CMainFrame ::的OnClose() {
PostQuitMessage(0);
//CFrameWndEx::OnClose(); << WE DO NOT WANT TO HAVE THIS CALLED!
}
这部分工作。设置为“FALSE”禁用了一些注册码,但仍有一对。重载'SaveState()'/'LoadState()'什么都不做,只会将它保存到“WindowPosition”中。所引用问题的答案不起作用。通过省略对SetRegistryKey()的调用得到断言,即使没有,也没有创建.ini文件。可能是VS2010的差异? – spoulson 2010-10-27 18:12:38
哎呀。我正在用'CWinApp'派生的类来测试,而不是'CWinAppEx'。感谢您的提醒。我更新了答案,以显示如何摆脱'WindowPlacement'。 (当你说“WindowPosition”时,你的意思是?) – Nate 2010-10-27 19:57:40