“Ctrl + F6”的默认处理在自定义 MDI 应用程序中不起作用
Posted
技术标签:
【中文标题】“Ctrl + F6”的默认处理在自定义 MDI 应用程序中不起作用【英文标题】:Default handling for "Ctrl + F6" is not working in a customized MDI Application 【发布时间】:2014-12-17 05:48:50 【问题描述】:我们有一个应用程序,它是使用 CFormView 类继承的基于 MDI 的 MFC 应用程序。问题是 Ctrl + F6 命令是所有 MDI 应用程序的默认命令,但在我们的应用程序中它不起作用。当我打开两个或更多子窗口时,当按下 Ctrl + F6 时,焦点不会移动到下一个 MDI 子窗口。
我已尝试创建新的 MFC MDI 应用程序示例,并且可以根据 Ctrl + F6 命令在窗口之间切换。我对 MFC 不熟悉,所以任何人都可以在这方面帮助我。
我想知道上述问题的根本原因是什么。
我能否得到一些确切的根本原因,为什么 Ctrl+f6 不适用于我的自定义 MFC MDI 应用程序,因为 Excel 工作表和 MS Word 以及许多 MDI 应用程序都支持 Ctrl+f6。
【问题讨论】:
【参考方案1】:CTRL+F6 是下一个窗格的加速键,仅在拆分窗口内处理。
这个加速器根本不用于 MDI 窗口。
如果您想在 MDI 窗口之间切换,只需在 CMainFrame (mainfrm.cpp) 实现中为 ID_NEXT_PANE 添加您自己的 OnCommand 处理程序并使用 MDINext() 和 MDIPrev()。
PS:我重新检查了MFC源代码后,答案有所改变。请包涵。
【讨论】:
我在 .RC 文件中找到了这些 IDR_MAINFRAME ACCELERATORS VK_F6、ID_NEXT_PANE、VIRTKEY、NOINVERT VK_F6、ID_PREV_PANE、VIRTKEY、SHIFT、NOINVERT 我的 ProcessMessageFilter 函数低于 BOOL CAMIBCPApp::ProcessMessageFilter(int code, LPMSG lpMsg) if(m_haccel) if (::TranslateAccelerator(m_pMainWnd->m_hWnd, m_haccel, lpMsg)) 返回(TRUE); 返回 CWinApp::ProcessMessageFilter(code, lpMsg); 我发现很难在这里以适当的方式添加评论。请不要介意....上面的评论在我的应用程序文件中有 RC 文件加速器表和 ProcessMessageFilter() 而不是 PretranslateMessage() 函数。 我尝试为 ID_NEXT_PANE 添加 ON_COMMAND 处理程序 OnNextPane(),并在处理程序函数 OnNextPane() 中调用 MDINext()。但是当我按下 Ctrl+F6 时,控件没有点击 ON_COMMAND 处理函数 OnNextPane()。 这里的问题最终是命令路由。 CView 在框架收到此消息之前获取消息。使用您自己的 ID...在加速器中定义它们并在大型机中使用此 ID。或者更改命令路由。 感谢您的快速回复。您可以在此处发布一段代码以添加我们自己的加速器和处理程序 ID。我只是在添加代码时感到困惑。以上是关于“Ctrl + F6”的默认处理在自定义 MDI 应用程序中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
jQuery .click() 在自定义函数之前执行默认动作
Delphi 2009 - 在自定义 Delphi 组件中设置默认属性值
为啥在自定义 WinRT C++/CX 控件中默认添加 [Windows::Foundation::Metadata::WebHostHidden]?