mfc的消息机制,mfc 命令消息

  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

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: