CFrameWnd::GetActiveView函数点滴

原创 2005年04月23日 18:47:00

       我用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的答案,请告诉我!谢谢 。    

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

相关文章推荐

MFC MDI GetActiveView() 为空

今天写了一个多文档的应用程序,要响应菜单消息。 消息是在MainFrame中响应的。然后对当前的活动窗口进行修改。 结果我直接调用GetActiveView()返回的一直是空。 我上网搜了一下没有找到...

Document\View\MainFrame--MessageMap

文档 视图 框架窗口间的关系和消息传送规律 在MFC中M$引入了文档-视结构的概念,文档相当于数据容器,视相当于查看数据的窗口或是和数据发生交互的窗口。(这一结构在MFC中的OLE,ODBC开发时又...

实习点滴 - 跟一个蠢bug学习多线程调试、线程安全和可重入函数

昨天同事帮忙review代码的时候,发现我代码里使用了一个非线程安全的函数localtime,并建议我使用线程安全的localtime_r。于是我查了一下相关资料:time 与 gettimeofda...

实习点滴 - 破窗理论、C++ 函数模板静态库

最近在搬砖,本以为仅仅是体力活而已,无奈自己功力不够,处处碰壁。这次的需求及其背景:业务中有一个recommendId的东西,类型是string或者vector< char >。第一个字节(即reco...

C++学习点滴 函数的工作原理 按值传递按址传递

C++学习点滴  函数原理 按值传递按址传递  深拷贝浅拷贝

编程经验点滴----避免在数据库访问函数中使用 try catch

看到很多数书中的代码示例,都在数据库访问函数中使用 try catch,误导初学者,很是痛心。 我们来分析一个常见的函数(来自国内某些大公司的代码,反面例子,不可仿效), 1 publi...
  • fjwlytt
  • fjwlytt
  • 2016年10月09日 14:54
  • 393

【学习点滴-数据结构-字符串】 字符串的堆分配方式实现和基本函数

//基于堆分配形式的string. #include #include #include #include #define SOVERFLOW -1 #define OK 1 #defin...

【点滴记录】free函数的作用

今天看一段程序,C真是少用。如下,是双向链表的清空操作: void bilistClear(Node *bl){ if(bl->data!=NULL){ free((char*)bl->d...

[js点滴]JavaScript关于函数总结

/*1.函数的概念 函数就是实现某一功能的代码片段. 2.函数的分类 a.预定义函数(系统函数) b.自定义函数 函数又称之为方法 ...

C++ 学习点滴 声明与定义的区别 内联函数

好久没更博客了,满满的负罪感,忙了两周期末考试,又无所事事的玩了一周,开始更博客。        记录一下最近学C++的一些东西吧。          1.声明与定义的区别           在C+...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CFrameWnd::GetActiveView函数点滴
举报原因:
原因补充:

(最多只允许输入30个字)