我有一个CWinAppEx
派生类和一个CFrameWndEx
派生类,但我不能在生活中理解如何使用键盘加速器。
我有一个带加速器的加速器表:
ID: ID_CLOSE_FOCUSED_WINDOW
Modifier: Ctrl
Key: W
Type: VIRTKEY
我在CFrameWndEx
派生类的消息映射中有这一行:
ON_COMMAND(ID_CLOSE_FOCUSED_WINDOW, CloseLastFocusedWindow)
我已尝试在PreTranslateMessage
派生类和CFrameWndEx
内调用PreTranslateMessage
覆盖TranslateAccelerators
,但我仍然没有收到与ID相同的命令在加速器表中 - 没有在CloseLastFocusedWindow
函数中命中断点。
任何人都能轻松一点吗?我觉得我正确地遵循文档,但它对我不起作用。
提前致谢
答案 0 :(得分:0)
几个想法。你确定CloseLastFocusedWindow有正确的签名吗?
应该相当于:
afx_msg void CloseLastFocusedWindow();
此外,DECLARE_MESSAGE_MAP()是否出现在上述声明之前?
我认为CFrameWndEx默认会为你调用TranslateAccelerator。通常,您只需要在不自动处理它们的地方(例如对话框窗口等)中关注LoadAccelerators和TranslateAccelerator。
修改强>
还要注意框架结构的方法很重要。例如,如果通过CSingleDocTemplate构造一个框架窗口,那么传递给CSingleDocTemplate构造函数的第一个参数将控制加载哪个加速器表。
示例:
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CMyView));
在上面的代码中,将加载IDR_MAINFRAME加速器表,并在那里输入任何所需的加速器。
答案 1 :(得分:0)
我现在遇到了类似的问题:除了默认视图(在CSingleDocTemplate中指定的视图)之外,我还以非标准方式创建了另一个视图。在处理完Ctrl + W组合以关闭非标准视图后,主菜单停止工作。然后结果发现我忘了设置一个新的活动视图。作为其副作用,该文件没有收到任何命令,例如来自上面提到的主菜单。
所以我的建议是:当你关闭(非标准创建的)视图时,不要忘记拨打CFrameWnd::SetActiveView
。