2010-10-26 27 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! 

}