mfc的消息机制,mfc消息循环

  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消息,并发送此消息以允许对话框中控件的字体被更改。

mfc的消息机制,mfc消息循环