在使用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使用我的加速器表并且不附加加速器或附加正确的加速器?
答案 0 :(得分:14)
刚刚花了太多时间来解决这个问题,我想我会发布看起来对我有用的解决方案。
我打电话:
theApp.GetKeyboardManager()->ResetAll();
我已经创建了一个名为PostLoadFrame()的特定函数,我在调用LoadFrame()之后立即调用它,这是注册表似乎被读取的地方。)
此函数调用忽略从注册表加载的任何加速器(这对我来说很好,因为我不允许自定义它们)并且在资源文件中使用加速器。
就像我说的那样,在我的申请中似乎对我有用。如果您允许自定义加速键,那么看起来可以将资源文件和注册表存储的值与CKeyboardManager中的其他函数合并,但它有点复杂。
我希望在某些地方帮助某人节省我失去的一些时间!!
答案 1 :(得分:6)
显然有些CMFCMenuBar设置会持久保存到注册表(我认为是HKCU。)尝试清除应用程序的注册表设置,看看是否显示了正确的加速器。
有关CMFCMenuBar的一些相关问题,请参阅此MSDN thread。