2010-10-26 55 views
4

默認情況下,Visual Studio 2010中的基本MFC C++項目將以用戶可配置的鍵名稱將其所有工作區設置存儲在HKCU註冊表配置單元中。這包括最後一個窗口大小/位置,色帶設置,狀態欄等。如何禁用MFC寫入註冊表的工作區設置?

如何完全禁用此功能以便根本不寫入註冊表?

我試過沒有設置SetRegistryKey(),這給了我一個從第一次讀取/寫入註冊表框架的調試斷言。 SetRegistryKey((LPCTSTR)NULL)給出了相同的結果。 SetRegistryBase()似乎沒有效果。 CWinApp/CWinAppEx似乎沒有其他方法可以幫助。

回答

4

編輯:我原來的答案是錯的。我編輯了答案。


你可以告訴MFC存儲在 .ini文件,而不是註冊表設置。見 this previous answer(更新:只有當您不使用CWinAppEx作品)

如果要防止MFC從節約一些菜單和工具欄 的狀態,以下內容添加到您的應用程序的構造函數:

m_bSaveState = FALSE; 

m_bSaveState成員,如果您的應用程序從CWinAppEx衍生才被定義。可以覆蓋CWinAppEx::SaveStateCWinAppEx::LoadState


爲了消除WindowPlacement註冊表項,覆蓋CWinAppEx::StoreWindowPlacement

您仍然可能會寫入其他註冊表項。完整的解決方案將涉及到CSettingsStore的子類,然後在您的應用程序中調用CSettingsStoreSP::SetRuntimeClass。 (See this瞭解更多信息。)這是相當困難的,因爲您需要在自定義CSettingsStore類中重寫一大堆虛擬函數。

+0

這部分工作。設置爲「FALSE」禁用了一些註冊碼,但仍有一對。重載'SaveState()'/'LoadState()'什麼都不做,只會將它保存到「WindowPosition」中。所引用問題的答案不起作用。通過省略對SetRegistryKey()的調用得到斷言,即使沒有,也沒有創建.ini文件。可能是VS2010的差異? – spoulson 2010-10-27 18:12:38

+0

哎呀。我正在用'CWinApp'派生的類來測試,而不是'CWinAppEx'。感謝您的提醒。我更新了答案,以顯示如何擺脫'WindowPlacement'。 (當你說「WindowPosition」時,你的意思是?) – Nate 2010-10-27 19:57:40

2

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

}