CFrameWnd::GetActiveView函数点滴

       我用vc6的生成向导生成了一个不使用document/view结构的运用程序。

        仔细看了一下他的结构,发现了一个函数如下(摘自mfc源代码):

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
 // let the view have first crack at the command
 if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
 {
  return TRUE;
 }
 // otherwise, do default handling
 return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}

         开始的时候,我对这段代码很不理解,因为OnCmdMsg函数是处理WM_COMMAND消息的。参照CFrameWnd::OnCmdMsg,CView::OnCmdMsg,CCmdTarget::OnCmdMsg,CDocument::OnCmdMsg的说明。似乎整个WM_COMMAND消息的流动路线已经被定型了,如下:

(图片摘自vckbase.com)

CFrameWnd::OnCmdMsg函数的部分代码如下:

BOOL CFrameWnd::OnCmdMsg(UINT nID, int nCode, void* pExtra,
 AFX_CMDHANDLERINFO* pHandlerInfo)
{
 CPushRoutingFrame push(this);

 // pump through current view FIRST
 CView* pView = GetActiveView();
 if (pView != NULL && pView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
  return TRUE;

 // then pump through frame
 if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
  return TRUE;

 // last but not least, pump through app
 CWinApp* pApp = AfxGetApp();
 if (pApp != NULL && pApp->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
  return TRUE;

 return FALSE;
}

   CFrameWnd::OnCmdMsg和上面的图相对照,似乎所有的WM_COMMAND消息到达CFrameWnd时,都会首先将这个消息发给view来处理,就是说在这里view总是比CFrameWnd的优先权高。那么在CMainFrame::OnCmdMsg函数中,似乎使用m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)没有必要,因为CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)函数执行后会首先把这个消息传递给比他高优先级的view。

   那么到底是怎么会事呀?

   后来经过普遍的测试,发现CFrameWnd::GetActiveView函数在不使用“document/view”结构的程序中,总是返回NULL。而这个程序恰好没有使用“document/view”结构。问题就在这。CFrameWnd::OnCmdMsg函数的CView* pView = GetActiveView()语句只能的到一个NULL,所以他不能在将WM_COMMAND消息发送给view.所以我们必须在CMainFrame::OnCmdMsg中明确的提供一个m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo),这样才可以把一个WM_COMMAND消息发送给view.来处理。

   

   这篇是小弟的第一篇关于mfc的习作,实际上本身自己对mfc的机制也有很多不懂的地方,很多的小实验本身的结果似乎是正确的,但这难免有失误的地方,欢迎大家指出错误的地方。现在正在找关于CFrameWnd::GetActiveView函数的相关资料,希望佐证自己的想法。如果哪个大哥知道这个函数到底能不能在非“document/view”结构下返回view的答案,请告诉我!谢谢 。    

  再次说明,这是一篇很初步的文章里面讲述的不一定正确,如有错误,请指出,我一定尽量保持它的正确性。

阅读更多
文章标签: command mfc null 测试
个人分类: 四书五经
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

CFrameWnd::GetActiveView函数点滴

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭