键盘消息/加速器处理MFC对话框的应用程序

介绍 有相当数量的Windows程序员坚持,通常非常坚持 强烈建议程序员应该避免重写预翻译的信息。他们 有他们这样说的理由,我相信他们是正确的。但在这个 文章我的目的不是去思考预译的意思是什么 对你有好处,还是你应该像躲避瘟疫一样躲避它。我发现 PreTranslateMessage在基于对话框的应用程序中非常方便 处理键盘消息。除了使用PreTranslateMessage,我还展示了 控件中如何覆盖ProcessMessageFilter来处理快捷键 基于对话框的应用程序。 使用预翻译信息处理对话框击键 你经常会听到新手问他们如何才能做到这一点 在基于对话框的应用程序中捕捉击键。大概他们想处理 WM_KEYDOWN / WM_KEYUP失败。整个问题是基于对话框 焦点总是在子控件上而不是主控件上 对话框窗口。那么你需要做什么呢?你需要重写 PreTranslateMessage。我将向您展示一个简单的示例。 假设你有一个基于对话框的应用程序,上面有很多编辑框 对话框。它基本上是一个数据输入程序,因此你觉得它会成功 对于终端用户来说,如果按回车键将焦点转移到 下一个编辑框,就好像他按了TAB。解决方法是如此简单和 很简单,我将在下面演示预翻译的信息。 隐藏,复制Code

BOOL CPreTransTestDlg::PreTranslateMessage(MSG* pMsg) 
{
    if(pMsg->message==WM_KEYDOWN)
    {
        if(pMsg->wParam==VK_RETURN)
            pMsg->wParam=VK_TAB;
    }	
    return CDialog::PreTranslateMessage(pMsg);
}

我所做的是检查是否消息是一个WM_KEYDOWN,如果它是 然后我检查wParam是否为VK_RETURN。如果我发现是这样,我就改变 wParam到VK_TAB,然后调用基类实现。容易啊? 使用ProcessMessageFilter处理基于对话框的快捷键 假设你在基于对话框的应用中有一个菜单 某些特定任务的加速键。你很快就会失望地发现 热键不工作。问题是模态对话框应用程序的 消息循环不调用TranslateAccelerator。我不知道为什么会这样。 微软团队决定人们不应该使用基于对话框的 编写复杂的应用程序,热键和菜单。 但像往常一样,他们也提出了一个变通方案。下面是你该怎么做 实现它。我想再次声明,尽管这是微软 推荐的技术将会有一个好的大多数MFC大师,像约瑟夫 比如新来的人,他会告诉你不应该这样做。但 有时你不得不牺牲优雅来快速完成任务 用最少的努力。 向CWinApp派生类添加成员变量。隐藏,复制CodeHACCEL m_haccel; 使用资源编辑器创建一个新的加速器,默认情况下是这样的 IDR_ACCELERATOR1命名。并添加一个新的加速键,这是一条捷径 为一些菜单项。在您的InitInstance中,将下列行放在 CDialog派生对象被声明隐藏复制Codem_haccel = LoadAccelerators(句柄(), MAKEINTRESOURCE (IDR_ACCELERATOR1)); 现在重写ProcessMessageFilter并修改函数,使其看起来像 如:- 隐藏,CPreTransTestApp::ProcessMessageFilter(int代码,LPMSG LPMSG) { 如果(m_haccel) { if (::TranslateAccelerator(m_pMainWnd-> m_haccel, lpMsg)) 返回(真正的); } 返回CWinApp: ProcessMessageFilter(代码,lpMsg); } 我们所做的就是调用TranslateAccelerator,如果它成功了,我们就不调用了 需要调用基类ProcessMessageFilter,就像消息一样 处理。我们返回TRUE。 免责声明 作者想在这里说明,上面提到的两种方法是 一般使用的方法,作者并没有以任何方式支持这些方法。 用户应该阅读更多关于预译信息和用法的文章 ProcessMessageFilter在他们的程序中使用它之前。 本文转载于:http://www.diyabc.com/frontweb/news3699.html

原文地址:https://www.cnblogs.com/Dincat/p/13461295.html