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

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

 2006-07-20 11:38:19 来源:WEB开发网   
核心提示: BOOL CWnd::OnCommand(WPARAM wParam,LPARAM lParam){……return OnCmdMsg(nID,nCode,NULL,NULL);}BOOL CFrameWnd::OnCmdMsg(……
BOOL CWnd::OnCommand(WPARAM wParam,LPARAM lParam)
{
  ……
  return OnCmdMsg(nID,nCode,NULL,NULL);
}
BOOL CFrameWnd::OnCmdMsg(……)
{
  CView* pView = GetActiveView();
  if(pView!=NULL&&pView->OnCmdMsg(……))  //相当于图1中Frame指向View的箭头
return TRUE;
   if(CWnd::OnCmdMsg(……))          //图1中Frame自身
     return TRUE;
   CWinApp *pApp = AfxGetApp();
   if(pApp != NULL && pApp->OnCmdMsg(……)) //图1中CWinApp对象
     return TRUE;
   return FALSE;
}
BOOL CView::OnCmdMsg(……)
{
   if(CWnd::OnCmdMsg(……))          //图1中View本身
     return TRUE;
   if(m_pDocument!=NULL) m_pDocument->OnCmdMsg(……);//图1中View到Doc箭头
   ……
}
BOOL CDocument::OnCmdMsg(……)
{
   if(CCmdTarget::OnCmdMsg(……))       //图1中Doc本身
return TRUE;
   if(m_pDocTemplate!=NULL&&m_pDocTemplate->OnCmdMsg(……))//图1中Doc Template
return TRUE;
   return FALSE;
}
BOOL CCmdTarget::OnCmdMsg(……)//注:CWnd没有重载CCmdTarget的OnCmdMsg
{
   ……
   for(pMessageMap=GetMessageMap();pMessageMap!=NULL;
pMessageMap=pMessageMap->pBaseMap)
   {
     lpEntry = AfxFindMessageEntry(pMessageMap->lpEntries,……);
     if(lpEntry!=NULL)
       return DispatchCmdMsg(……lpEntry->pfn,……);
   }
return FALSE;
}

从代码中可以看出,OnCmdMsg各自调用的顺序刚好就是图1中所要求的顺序,这样也就实现了消息的拐弯流动,最后DispatchCmdMsg 函数是调用找到的消息处理函数处理消息。至此消息从出现到找到处理函数已经完成!

上一页  1 2 3 4 5 6 

Tags:VC 初学者 入门

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