mfc的消息机制,mfc消息循环
MS-VisualC++的类库(微软基础班的缩写)消息传递顺序
LRESULT回调AfxWndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam)
{
//将窗口标识为使用AfxWndProc的特殊消息
if (nMsg==WM_QUERYAFXWNDPROC)
返回1;
//所有其他消息通过消息映射路由
CWnd * pWnd=CWnd:fromnhandlepermanent(hWnd);
断言(pWnd!=NULL);
ASSERT(pWnd-m _ hWnd==hWnd);
if (pWnd==NULL pWnd- m_hWnd!=hWnd)
return :DefWindowProc(hWnd,nMsg,wParam,lParam);
返回AfxCallWndProc(pWnd,hWnd,nMsg,wParam,lParam);
}
1.AfxWndProc()该函数负责接收消息,找到消息所属的拥塞窗口对象,然后调用AfxCallWndProc。
LRESULT afx API AfxCallWndProc(CWnd * pWnd,HWND hWnd,UINT nMsg,
WPARAM wParam=0,LPARAM lParam=0)
{
_ AFX _ THREAD _ STATE * pThreadState=_ AFX threadstate .get data();
MSG old state=pThreadState-m _ lastSentMsg;//保存以便嵌套
pThreadState-m _ lastsentmsg。hWnd=hWnd
pThreadState-m _ lastsentmsg。message=nMsg
pThreadState-m _ lastsentmsg。wParam=wParam
pThreadState-m _ lastsentmsg。lParam=lParam
#ifdef _DEBUG
if(afxTraceFlags tracewimsg)
_AfxTraceMsg(_T(WndProc ),pThreadState-m _ lastSentMsg);
#endif
//捕捉在回调范围之外引发的异常
//在调试版本中并警告用户。
LRESULT lResult
尝试
{
# IFN def _ AFX _ NO _ OCC _支持
//WM _ DESTROY的特殊情况
if((nMsg==WM _ DESTROY)(pWnd-m _ pCtrlCont!=NULL))
pWnd-m _ pCtrlCont-onuiaactivate(NULL);
#endif
//WM _ init对话框的特殊情况
CRect rectOld
DWORD dw style=0;
if (nMsg==WM_INITDIALOG)
_AfxPreInitDialog(pWnd,rectOld,dw样式);
//委托给对象的窗口进程
lResult=pWnd- WindowProc(nMsg,wParam,lParam);
//WM _ init对话框的更多特殊情况
if (nMsg==WM_INITDIALOG)
_AfxPostInitDialog(pWnd,rectOld,dw样式);
}
全包
{
CWinThread * pWinThread=AfxGetThread();
if ( pWinThread!=空)
{
lResult=pWinThread-ProcessWndProcException(e,pThreadState-m _ lastSentMsg);
TRACE1(警告:窗口过程中未捕获的异常(返回%ld).n ,
lResult);
}
其他
{
TRACE0(警告:窗口过程中出现未捕获的异常. n );
lResult=0;
}
删除_异常(e)和:
}
END_CATCH_ALL
pThreadState-m _ lastSentMsg=旧状态;
返回lResult
}
2.AfxCallWndProc()该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数。
3.WindowProc()该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数。
4.OnWndMsg()该函数的功能首先按字节对消息进行排序,对于WM _命令消息,调用OnCommand()消息响应函数,对于WM _通知消息调用OnNotify()消息响应函数。任何被遗漏的消息将是一个窗口消息OnWndMsg()函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。如果OnWndMsg()函数不能找到这样的处理函数的话,则把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数。
5.OnCommand()该函数查看这是不是一个控件通知(lParam参数不为空,如果参数参数为空的话,说明该消息不是控件通知),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;如果他不是一个控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调OnCmdMsg()函数。
6.OnCmdMsg()根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(命令路由)的过程中潜在的传递命令消息和控件通知。例如:如果拥有该窗口的类是一个框架类,则命令和通知消息也被传递到视图和文档类,并为该类寻找一个消息处理函数。
MS-VisualC++的类库(微软基础班的缩写)应用程序创建窗口的过程
1.PreCreateWindow()该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变创建参数(可以设置窗口风格等等)。
2.PreSubclassWindow()这也是一个重载函数,允许首先子类化一个窗口。
3.OnGetMinMaxInfo()这个函数是一个消息响应函数,它响应WM_GETMINMAXINFO消息。允许设置窗口的最大或最小尺寸。
4.OnNcCreate()这个函数也是一个消息响应函数。作为对WM_NCCREATE消息的响应,它发送一条消息告诉窗口的客户区它即将被创建。
5.OnNcCalcSize()这个函数也是一个消息响应函数,响应WM_NCCALCSIZE消息,它的作用是允许窗口客户区大小改变。
6.OnCreate()这个函数也是一个消息响应函数。作为对WM_CREATE消息的响应,它发送一条消息,告知窗口已经创建。
7.OnSize()这个函数也是一个消息响应函数,它响应WM_SIZE消息并发送它来告知窗口大小已经改变。
8.八号。OnMove()消息响应函数响应WM_MOVE消息。发送此消息表示车窗正在移动。
9.OnChildNotify()这个函数被重载并作为消息映射的一部分被调用,告诉父窗口它将被告知一个窗口刚刚被创建。
MFC应用程序关闭窗口的顺序(无模式窗口)
1.1号。OnClose()消息响应函数响应窗口的WM_CLOSE消息,并在单击关闭按钮时发送该消息。
2.OnDestroy()消息响应函数,响应一个窗口的WM_DESTROY消息,当一个窗口将要被销毁时发送这个消息。
3.三号。OnNcDestroy()消息响应函数响应窗口的WM_NCDESTROY消息,并在窗口被销毁时发送该消息。
4.PostNcDestroy()重载函数,作为处理OnNcDestroy()函数的最后一个动作,由CWnd调用。
MFC应用程序中打开模式对话框的顺序
1.重载domodal()函数和DoModal()成员函数。
2.PreSubclassWindow()重载该函数,允许您首先子类化一个窗口。
3.三号。OnCreate()消息响应函数响应WM_CREATE消息,并发送该消息以告知窗口已被创建。
4.OnSize()消息响应函数,它响应WM_SIZE消息并发送此消息以告知窗口大小的变化。
5.OnMove()消息响应函数,响应WM_MOVE消息,发送这个消息告诉窗口它正在移动。
6.六号。OnSetFont()消息响应函数响应WM_SETFONT消息,并发送此消息以允许对话框中控件的字体被更改。
7.OnnitDialog()消息响应函数,它响应WM_INITDIALOG消息并发送此消息以允许对话框中的控件被初始化,或者创建一个新的控件。
8.八号。OnShowWindow()消息响应函数响应WM_SHOWWINDOW消息,由ShowWindow()函数调用。
9.OnCtlColor()消息响应函数,响应WM_CTLCOLOR消息,由父窗口发送,改变对话框或对话框上方控件的颜色。
10.OnChildNotify()重载函数,该函数作为WM_CTLCOLOR消息的结果发送。
MFC应用程序中关闭模式对话框的顺序
1.1号。OnClose()消息响应函数,响应WM_CLOSE消息,在单击“关闭”按钮时调用。
2.OnKillFocus()消息响应函数,响应WM_KILLFOCUS消息,在窗口即将失去键盘输入焦点之前发送。
3.OnDestroy()消息响应函数,响应WM_DESTROY消息,在窗口即将被销毁时发送。
4.OnNcDestroy()消息响应函数,响应WM_NCDESTROY消息,在窗口销毁后发送。
5.PostNcDestroy()重载函数,CWnd调用它作为处理OnNcDestroy()函数的最后一个动作。
打开无模式对话框的顺序
1.PreSubclassWindow()重载该函数,允许用户首先对窗口进行子分类。
2.2号。OnCreate()消息响应函数响应WM_CREATE消息,并发送该消息以告知窗口已被创建。
3.OnSize()消息响应函数,它响应WM_SIZE消息并发送此消息以告知窗口大小的变化。
4.OnMove()消息响应函数,响应WM_MOVE消息,发送这个消息告诉窗口它正在移动。
5.五号。OnSetFont()消息响应函数响应WM_SETFONT消息,并发送此消息以允许对话框中控件的字体被更改。