3

在使用 VS2008 的 doc/view 项目中,MFCMenuBar似乎从项目中加载了正确的 MENU 资源 (IDR_MAINFRAME),因为添加和删除菜单项反映在菜单的 UI 中。它甚至将加速器附加到默认菜单项(例如 Ctrl+O 到 Open... 项)。但是,加速器表 (IDR_MAINFRAME) 似乎没有连接到菜单。将 Open... 的默认 Ctrl+O 更改为 Ctrl+7 之类的内容不起作用。Ctrl+O 仍然附加到 Open... 菜单项,并且 Ctrl+O 仍然调用 Open... 处理程序。资源文件中只有一个加速器表,所以我不知道 CMFCMenuBar 从哪里获取它的加速器信息。

此时,我已经能够通过手动加载 IDR_MAINFRAME 加速器表并自己翻译消息来使加速器工作。但 CMFCMenuBar 仍在附加默认加速器。

谁能解释这里发生了什么?如何强制 MFCMenuBar 使用我的加速器表并且不附加加速器或附加正确的加速器?

4

2 回答 2

16

刚刚花了太多时间来解决这个问题,我想我会发布似乎对我有用的解决方案。

我打电话 :

theApp.GetKeyboardManager()->ResetAll();

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

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

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

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

于 2010-11-15T16:01:47.727 回答
6

显然,一些 CMFCMenuBar 设置保留在注册表中(我认为是 HKCU。)尝试清除应用程序的注册表设置,看看是否显示了正确的加速器。

有关一些相关的 CMFCMenuBar 故障排除,请参阅此MSDN 线程

于 2009-08-23T13:47:18.683 回答