C++ 为什么CMFCMenuBar不使用加速器表?

C++ 为什么CMFCMenuBar不使用加速器表?,c++,mfc,mfc-feature-pack,accelerator,C++,Mfc,Mfc Feature Pack,Accelerator,在使用VS2008的doc/view项目中,a似乎从项目中加载了正确的菜单资源(IDR_MAINFRAME),因为添加和删除菜单项会反映在菜单的UI中。它甚至会将加速器附加到默认菜单项(例如,将Ctrl+O添加到打开的…项)。但是,加速器表(IDR_大型机)似乎没有连接到菜单。正在更改打开的默认Ctrl+O。。。按Ctrl+7这样的键不起作用。Ctrl+O仍然附加到打开的。。。菜单项,并且Ctrl+O仍然调用打开的。。。处理程序。资源文件中只有一个accelerator表,因此我不知道CMFCM

在使用VS2008的doc/view项目中,a似乎从项目中加载了正确的菜单资源(IDR_MAINFRAME),因为添加和删除菜单项会反映在菜单的UI中。它甚至会将加速器附加到默认菜单项(例如,将Ctrl+O添加到打开的…项)。但是,加速器表(IDR_大型机)似乎没有连接到菜单。正在更改打开的默认Ctrl+O。。。按Ctrl+7这样的键不起作用。Ctrl+O仍然附加到打开的。。。菜单项,并且Ctrl+O仍然调用打开的。。。处理程序。资源文件中只有一个accelerator表,因此我不知道CMFCMenuBar从何处获取其accelerator信息

此时,我已经能够通过手动加载IDR_大型机加速器表并自己翻译消息来让加速器工作。但CMFCMenuBar仍在添加默认加速器


有人能解释一下这是怎么回事吗?如何强制MFCMenuBar使用我的加速器表,而不附加加速器或附加正确的加速器?

显然,某些CMFCMenuBar设置会保留到注册表(我想是HKCU)。请尝试清除应用程序的注册表设置,看看是否显示了正确的加速器


有关CMFCMenuBar故障排除的相关信息,请参见本页。

刚刚花了太多时间来解决这个问题,我想我应该发布一个似乎适合我的解决方案

我呼吁:

app.GetKeyboardManager()->ResetAll()

从注册表加载MDI框架之后(我创建了一个名为PostLoadFrame()的特定函数,我在调用LoadFrame()后立即调用该函数,这似乎是注册表读取的地方)

此函数调用忽略从注册表加载的任何加速器(这对我来说很好,因为我不允许自定义它们),而是使用资源文件中的加速器

就像我说的,它似乎在我的应用程序中对我有效。如果允许自定义加速器键,那么看起来可以将资源文件和注册表存储值与CKeyboardManager中的其他函数合并,但这要复杂一些


我希望这能帮助某个地方的人节省一些我失去的时间

CDockablePane没有使用最近更新的加速器表,我也有同样的问题。清除HKCU\软件\\解决了问题。我想同样的事情对CMFCMenuBar也有帮助。不过这有点像一把大锤。上面带有ResetAll()的选项更好。