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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值