vc PreTranslateMessage()详解
(2010-09-09 20:24:28)
标签:
pretranslatemessagevc消息控制酷云it |
分类: c语言 |
1.函数原型:(MSDN)
virtual BOOL PreTranslateMessage( MSG *pMsg );
功能:
在MFC中,PreTranslateMessage是虚函数,我们可以重载它来处理键盘和鼠标消息。
在sdk中,这又有所不同,我们必须在回调函数中LRESULT
2.说明:
该函数表示在消息处理(TranslateMessge()和DispatchMessage()等)前所作的操作,如果函数返回值为TRUE,那么消息处理即终止,不会调用TranslateMessge()和DispatchMessage()来翻译和分发消息给相应的窗口;若返回值为 FALSE,才会调用翻译和分发消息函数。
该函数是MFC消息控制流最具特色的地方,它是CWnd类的虚拟函数,通过重载这个函数,我们可以改变MFC的消息控制流程,甚至可以作一个全新的控制流出来。
在win32程序中,关于消息有两种传递方式:
a.MFC消息,MFC会把所有的消息一条条放到一个AFX_MSGMAP_ENTRY结构中,形成一个数组,该数组存放了所有的消息和与它们相关的参数。也可以说是放到消息队列里去。
b. 采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息。
这两种方式中只有第一种(穿过消息队列的消息)才受PreTranslateMessage()影响,
第二种消息并不会理睬PreTranslateMessage()的存在。
二、传给PreTranslateMessage()的消息是未经翻译过的消息,它没有经过TranslateMessage()处理。可以在该函数中使用(pMsg->wParam==VK_RETURN)来拦截回车键。
三、在WindowProc里不能处理WM_Char消息。(WindowProc函数见MFC消息响应机制一文)
四、SetWindowText会发送WM_Char给窗口。
五、PeekMessage和GetMessage的区别:
另一篇文章中:
if (pMsg->message==WM_KEYDOWN
&&
pMsg->wParam==VK_RETURN)
如此,就可避开对话框默认处理,将消息传递下去。注意:只有对话框才会默认处理按下回车,CANCEL消息,其他控件窗口则不会,所以在其他窗口中不必重载PreTranslateMessage函数,当然如果重载了也不会错。
附:关于PreTranslateMessage()函数的小程序示例:
BOOL CSearchuserDlg::PreTranslateMessage(MSG* pMsg)
{
}
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{