WEB开发网
开发学院软件开发VC VC初学者入门系列之二:消息循环 阅读

VC初学者入门系列之二:消息循环

 2006-07-20 11:38:19 来源:WEB开发网   
核心提示: 五、MFC消息的流动消息的起点是AfxWndProc函数,所有的消息都被发送到AfxWndProc,VC初学者入门系列之二:消息循环(5),也从AfxWndProc再次流向各自的消息响应函数的,怎么流的呢?那只有MFC知道:LRESULT CALLBACK AfxWndProc(&hell

五、MFC消息的流动

消息的起点是AfxWndProc函数,所有的消息都被发送到AfxWndProc,也从AfxWndProc再次流向各自的消息响应函数的,怎么流的呢?那只有MFC知道:

LRESULT CALLBACK AfxWndProc(…….)
{
……
return AfxCallWndProc(pWnd,hWnd,nMsg,wParam,lParam);
}
LRESULT AFXAPI AfxCallWndProc(……)
{
……
lResult = pWnd->WindowProc(nMsg,wParam,lParam);
……
}
LRESULT CWnd::WindowProc(……)
{
……
if(!OnWndMsg(message,wParam,lParam,&lResult))
lResult = DefWindowProc(message,wParam,lParam);
……
}
BOOL CWnd::OnWndMsg(……)//该函数原来太过庞大,被我改造了一下,只反映意思,不能执行
{
  ……
  if(message == WM_COMMAND)
     OnCommand(wParam,lParam);
  if(message == WM_NOTIFY)
     OnNotify(wParam,lParam,&lResult);
  pMessage = GetMessageMap();
  for(; pMessageMap!=NULL; pMessageMap = pMessageMap->pBaseMap)
  {
    if((lpEntry=AfxFindMessageEntry(pMessageMap->lpEntries,
message,0,0))!=NULL)
break;
  }
  
  (this->*(lpEntry->pnf))(……);//调用消息响应函数
}
AFX_MSGMAP_ENTRY AfxFindMessageEntry(……)
{
  ……
  while(lpEntry->nSign!=AfxSig_end)
  {
    if(lpEntry->nMessage==nMsg&&lpEntry->nCode==nCode&&nID>=lpEntry->nID
       &&nID<=lpEntry->nLastID)
    {
       return lpEntry;
    }
    lpEntry++;
  }
……
}

消息被发送到对应窗口的OnWndMsg后,然后根据消息的类型采取相应动作:如果是标准消息,则检查但前类中有无处理函数(由AfxFindMessageEntry实现),若没有,就在其父亲类中找(通过pMessageMap->pBaseMap实现),这样望上顺序搜索消息网,搜索结束也找不到处理函数,那么回到WindowProc函数调用默认DefWindowProc函数;如果是命令消息或通知消息则发送到OnCommand或者OnNotify函数中去处理,来实现消息的拐弯流动:

上一页  1 2 3 4 5 6  下一页

Tags:VC 初学者 入门

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接