MDIFrameWnd类GetActiveFrame和MDIGetActive的区别

查看msdn可以知道GetActiveFrame其实是CFrameWnd的方法,是MDIFrameWnd继承而来的方法,在msdn中其说明为:

CFrameWnd::GetActiveFrame  

virtual CFrameWnd* GetActiveFrame( );

Return Value

A pointer to the active MDI child window. 

If the application is an SDI application, or the MDI frame window has no active document, the implicit this pointer will be returned.

Remarks

  If there is no active MDI child or the application is a single document interface (SDI), the implicit this pointer is returned.

    从说明中我们可以看出,如果改CFrameWnd对象是MDI frame window那么并且其有active document,那么该方法的返回值应该是active MDI child window。这是官方的说明。


我们在看一下MDIGetActive方法的说明:

CMDIFrameWnd::MDIGetActive


CMDIChildWnd* MDIGetActive(
   BOOL* pbMaximized = NULL 
) const;

Parameters

pbMaximized

A pointer to a BOOL return value. Set to TRUE on return if the window is maximized; otherwise FALSE.

Return Value

A pointer to the active MDI child window.

    从上述说明中我们可以看出MDIGetActive是CMDIChildWnd的方法,不是从CFrameWnd继承而来的,在当前的Frame对象是CMDIFrameWnd对象的话而且有Active document的话,则二者应该是没有区别的。

   但实际情况是否如此呢?至少我今天的经验告诉我,不是如此。还是那个图像处理算法框架的问题,昨天将RTTI做好之后,今天加进去了。但是其中在调用的时候出现了问题,由于消息响应是在一LeftPanel中,不是在Doc中间,所以需要从CAlgorithDialog中间获取Doc对象,下面是我的两种获取方式:

方法一:

  

		CMainFrame* pWnd=(CMainFrame*)AfxGetMainWnd();
		CImgPlatformDoc* pDoc=(CImgPlatformDoc*)pWnd->MDIGetActive()->GetActiveView()->GetDocument();
方法二:

		CMainFrame* pWnd=(CMainFrame*)AfxGetMainWnd();
		//CImgPlatformDoc* pDoc=(CImgPlatformDoc*)pWnd->MDIGetActive()->GetActiveView()->GetDocument();
		CImgPlatformDoc* pDoc=(CImgPlatformDoc*)pWnd->GetActiveFrame()->GetActiveView()->GetDocument();

   你会发现第二种方法获取的pDoc实际上是一个NULL值。今天下午在这个问题上犯困了很久,因为一直没有办法获取到Doc对象,一直觉得很奇怪,各种手段都用上了,包括发送自定义消息到CMainFrame中,从CMainFrame中调用Doc对象进行处理,但是发现获取的DOC对象一直是NULL,因为获取GetActiveFrame的方法一直没有变,不要和我说你直接用GetActiveDocument方法来获取DOC对象,我也尝试过,发现和第二种方法一样也是空。

    到目前为止还没有找个这两者之间到底有什么区别,看到网上很多人说值CMainFrame中直接用GetActiveDocument就可以获取当前Active的DOC对象了,我表示很怀疑,因为确实会有返回值,但是你查看对象数据就会发现数据时不对的,而且返回的DOC对象的地址其实是0x00000000也就是说是一个NULL对象。

    希望有了解这个问题的同学给我讲解一下这个问题吧。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值