2014-02-10 93 views
0

我有一个CWinAppEx派生类和CFrameWndEx派生类,但我不能为我的生活理解如何使用键盘加速器。C++ MFC键盘加速器

我有一个加速器表加速器:

ID:  ID_CLOSE_FOCUSED_WINDOW 
Modifier: Ctrl 
Key:  W 
Type:  VIRTKEY 

我有我的CFrameWndEx派生类的消息映射这一行:

ON_COMMAND(ID_CLOSE_FOCUSED_WINDOW, CloseLastFocusedWindow) 

我曾试图得到的CFrameWndEx覆盖PreTranslateMessage类和内部PreTranslateMessage调用TranslateAccelerators但我仍然没有收到一个命令,它与加速器表中的ID相同 - 没有在中遇到断点功能。

任何人都可以摆脱一些光?我觉得我正确地遵循文档,但它不适合我。

在此先感谢

+0

我认为加速器的资源ID(例如:'IDR_MAINFRAME')应该与用于加载帧的资源ID相匹配 –

+0

感谢Edward,我的资源ID与用于加载帧的ID相匹配。 –

回答

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加速器表将被加载和任何所需的促进剂应该有输入。

+0

嗨马克,谢谢你的回复。 CloseLastFocusedWindow具有确切的签名,包括afx_msg。消息映射也正确组成 - 我使用它来捕获许多其他命令消息。 我想知道它是否会为我调用TranslateAccelerator,因为它肯定会调用LoadAccelerators(如果我自己调用LoadAccelerators,则声明为断言,因为它不止一次调用该函数)。 –

+0

你是如何创建框架窗口? – Mark

+0

我更新了我的答案,以讨论框架窗口构造注意事项。让我知道这是否有帮助。 – Mark

0

我现在遇到类似的问题:除了默认视图(CSingleDocTemplate中的一个),我以非标准方式创建了另一个视图。处理Ctrl + W组合关闭非标准视图后,主菜单停止工作。然后,事实证明,我忘了设置一个新的积极的看法。作为这种副作用,文档没有收到任何命令,例如,从提到的主菜单。

所以我的建议是:当你关闭一个(非标准创建的)视图时,不要忘记调用CFrameWnd::SetActiveView