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中各种指针的获取

转来的图表 获得CWinApp 获得CMainFrame 获得CChildFrame 获得CDocument ...
  • golden_edge
  • golden_edge
  • 2015年06月16日 13:51
  • 394

MFC MDI GetActiveView() 为空

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

MFC中CFrameWnd::GetActiveView函数的使用

被一个小bug卡了很长时间,走了很多弯路。应该先查MSDN的。我的错误在于不知道“在MDI应用程序中,MDI主框架窗口没有一个关联的视图。 相反,每个单独的子窗口(CMDIChildWnd)具有一个或...
  • insaneguy
  • insaneguy
  • 2013年06月22日 00:40
  • 1210

MFC CWinApp派生类中使用CFrameWnd派生类的成员函数Create来创建窗口

在MFC程序中出现的问题是:在CWinApp的派生类中,使用p_MainWnd指向使用new创建的CFrameWnd派生类的对象指针,然后使用该指针调用CFrameWnd的成员函数Create,但是结...
  • skdkjxy
  • skdkjxy
  • 2013年12月02日 14:34
  • 804

CFrameWnd模态显示

参考:http://www.codeproject.com/Articles/4248/Modal-MFC-frame-window 关键文件ModalFrame.h、ModalFrame.cpp,...
  • segen_jaa
  • segen_jaa
  • 2013年04月08日 10:59
  • 1915

CFrameWnd

CFrameWnd类往往用于创建应用程序的主窗口,因为它能很好地支持系统菜单和控制条(工具条、状态条等),为此定义了大量的成员函数和变量。在编写文档/视图结构的应用程序时,CFrameWnd作为主窗口...
  • flymachine
  • flymachine
  • 2012年01月30日 19:01
  • 1059

MFC简单框架启动流程(CWinApp,CFrameWnd)

先看下例子代码 #include class CMyFrameWnd : public CFrameWnd { public: CMyFrameWnd(); virtual ~CMy...
  • xufan123123
  • xufan123123
  • 2012年12月30日 22:55
  • 4159

MFC的CwinApp与CFrameWnd的关系(3)-小白理解MFC

学习MFC系列
  • lhxy24
  • lhxy24
  • 2017年06月22日 19:16
  • 208

weblogic中的编程点滴

(以下内容也许读者不能正确理解,此文供自己日后查阅参考)VARCHAR和CHAR    如果数据库中的表定义字段的时候,至少Oracle是这样,采用VARCHAR和CHAR的区别在于,当Java控件里...
  • yuanfen127
  • yuanfen127
  • 2006年05月07日 22:42
  • 1075

IMPLEMENT_DYNCREATE(CMainFrame,CFrameWnd)

IMPLEMENT_DYNCREATE(CMainFrame,CFrameWnd)//声明CMainFrame类是从CFrameWnd类派生 //动态声明宏,可以不管它,向导生成 BEGIN_ME...
  • xbeinonlinkejidaxue
  • xbeinonlinkejidaxue
  • 2014年10月26日 16:42
  • 791
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CFrameWnd::GetActiveView函数点滴
举报原因:
原因补充:

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