我知道這對很多人來說已經晚了,但是我發現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