我创建了一个使用
CMFCToolBar
和 CMFCMenuBar
的 MFC 应用程序。它保存了它的第一次项目状态,当我更改或添加任何动态项目时,我仍然看到第一个状态,已删除的项目保留在那里,添加的项目没有显示,然后我发现所有项目都在注册表中序列化并每次加载,我们所有的应用程序都从应用程序的模块加载动态菜单项或工具栏按钮,实际上我无法使其工作,除非使用以下解决方案
class CToolBarEx : public CMFCToolBar
{
public:
CToolBarEx()
{
}
virtual BOOL LoadState(LPCTSTR /*lpszProfileName*/ = NULL, int /*nIndex*/ = -1, UINT /*uiID*/ = (UINT) -1) { return FALSE; }
virtual BOOL SaveState(LPCTSTR /*lpszProfileName*/ = NULL, int /*nIndex*/ = -1, UINT /*uiID*/ = (UINT) -1) { return FALSE; }
};
class CMenuBarEx : public CMFCMenuBar
{
public:
CToolBarEx()
{
}
virtual BOOL LoadState(LPCTSTR /*lpszProfileName*/ = NULL, int /*nIndex*/ = -1, UINT /*uiID*/ = (UINT) -1) { return FALSE; }
virtual BOOL SaveState(LPCTSTR /*lpszProfileName*/ = NULL, int /*nIndex*/ = -1, UINT /*uiID*/ = (UINT) -1) { return FALSE; }
};
这是我可以用来向工具栏或菜单栏添加动态项目的唯一方法,但这不是解决方案,我没有利用任何自定义工具并保存菜单栏位置,这就是微软希望人们这样做的方式吗?处理菜单和工具栏?推一次就不允许更改?或者我错过了一些关于这个的事情?
不幸的是,这就是它的工作方式,因为 Microsoft 从 BCG 工具包派生了 CMFC 类。 我们在应用程序中遇到了同样的问题,并通过从 mainframe 类更新工作空间(例如工具栏、菜单项等)来解决它。 此外,我们选择将状态保存在 XML 文件中。