C ++ MFC键盘加速器

时间:2014-02-10 21:52:20

标签: c++ mfc

我有一个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函数中命中断点。

任何人都能轻松一点吗?我觉得我正确地遵循文档,但它对我不起作用。

提前致谢

2 个答案:

答案 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