mfc的消息机制,mfc 命令消息
Win32中下的消息流程清晰明了,但在MFC(消歧义)下,由于封装的缘故,隐藏的有点深,对一般的开发人员而言,就不甚明了喽。本文试图粗略展示出MFC(消歧义)下消息处理的基本流程。
一~我爱你~先看一下Win32中下的消息处理流程
每一个线程都对应有一个消息队列,利用美国石油学会函数GetMessage(消息)从消息队列中获取消息,然后利用翻译消息(翻译)翻译消息(主要是一些键盘消息),再利用调度消息(调度消息)将消息分发给对应的窗口过程函数处理。
msgmsg
* GetMessage(msg,NULL,NULL,NULL);
如果(!afxpresslatemessage(msg))
{
*翻译(消息):
:调度消息(消息):
}
返回真实:
}
bool afx API afxinternalumpmessage()
味精味精
* GetMessage(msg,NULL,NULL,NULL);
如果(!afxpresslatemessage(msg))
*翻译(消息):
:调度消息(消息):
返回真实的
}
注:以上代码为示意代码,具体请参照MFC(消歧义)的源码。
很显然,其消息处理流程也类似一中Win32中下的消息处理,只不过在调用翻译消息调度消息处理消息前增加了类似过滤的函数afxpretranslatemessage .该函数会调用CWnd加拿大)类的翻译前信息-预先处理讯息函数,函数返回真的吗则消息将不会被处理。我们经常会通过重载CWnd加拿大)类的翻译前信息-预先处理讯息来改变MFC(消歧义)的消息控制流程。
2 ._窗口过程函数
通过调用调度消息(调度消息)将消息分发给了具体的窗口过程函数处理。MS-VisualC++的类库(Microsoft Foundation Class的缩写)下的所有窗口都拥有公用的窗口过程函数AfxWndProc。该函数的示意代码如下:
lrsultcallbackafxfwndproc(hwnd、UINTnMsg、wparamwparam、lParam)
{
cwnd * pwnd=cwnd:fromhandle代理(hwnd);//从温得获取对应的CWnd*
如果(pWnd==NULLpWnd- m_hWnd!=hWnd)
返回* DefWindowProc(hWnd、nMsg、wParam、lparam
其他语句
returnpWnd- WindowProc(nMsg、wParam、lparam
}
lresult回调AfxWndProc(HWND、UINT nMsg、WPARAM wParam、LPARAM)
cwnd * pwnd=cwnd:fromhandle代理(hwnd);//从温得获取对应的CWnd*
if (pWnd==NULL pWnd- m_hWnd!=hWnd)
返回* DefWindowProc(hWnd、nMsg、wParam、lparam
其他语句
返回pWnd- WindowProc(nMsg、wParam、lparam
}
很显然,调用了CWnd加拿大)类的虚函数虚拟CWnd:WindowProc处理。
lrsultcwnd:window proc(uintmmessage、wparamwparam、lParam)
{
onwndmsgdoesmostofthework,exceptfordefwindowproccall除外
领导者结果=0:
如果(!WndMsg(消息、wParam、lparam、lresult)
lrsult=def windowproc(message,wParam,lparam
returnlresult(返回结果):
}
lrsult cwnd:window proc(uint message、WPARAM wParam、lparam lparam)
//OnWndMsg除了执行内定的消息处理调用外,大部分工作都完成
领导者结果=0:
如果(!WndMsg(消息、wParam、lparam、lresult)
lrsult=defwindowproc(message、wParam、lparam
返回结果;
}
温特洛普函数又调用了CWnd加拿大)类的虚函数虚拟CWnd:OnWndMsg处理。
bool cwnd:onwndmsg(uintmmessage、wparamwparam、lparamlparam、lresult * presult)
{
领导者结果=0:
unionmessagemapfunctionsmmf
mmf。pfn=0
cinteralglobalclockwinmsgid锁;
//specialcaseforcommands
如果(讯息==WM_COMMAND)
{
if(oncommand(wparam、lparam)
{
lresult=1
转到语句真实;
}
返回假的;
}
//specialcasefornotification
如果(讯息==WM_NOTIFY)
{
nm HDR * pnmhdr=(nm HDR *)LPAR;
if(pNMHDR- hwndFrom!=NULL OnNotify(wParam、lparam、lresult)
转到语句真实;
返回假的;
}
.我.
返回真实:
}
BOOL CWnd:OnWndMsg(UINT message、WPARAM wParam、LPARAM、lresult * presult)
领导者结果=0:
联合消息映射函数mmf
MMF。pfn=0;
cinternalgloballock winmsglock
//命令的特殊情况
如果(消息==WM_COMMAND)
if(oncommand(wparam、lparam)
lrsult=1;
转到语句真实:
返回错误的
//通知的特殊情况
如果(消息==WM_NOTIFY)
nm HDR * pnmhdr=(nm HDR *)LPAR;
if (pNMHDR- hwndFrom!=NULL OnNotify(wParam、lparam、lresult)
转到语句真实:
返回错误的
.我.
返回真实的
}
在WndMsg(消歧义)函数中会根据具体的消息类型,在MFC(消歧义)的消息映射表中找到对应的函数处理。
以上就是MFC(消歧义)处理消息的大致流程。
来自:http://博客。。net/王耀1052/文章/详情/8045017