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