SDI和MDI获得文档和视图对象的方法

一.因为对于SDI程序,主框架窗口就是文档框窗(如果这个也不知道,就要查看一下MFC下的单文档的构成原理了).           下面所说的是关于单文档的. 

例子: 在CMainFrame框架中如何得到视图类的指针.可以 先得到框架指针,然后调用 GetActiveView 函数指向当前活动视. C...View * pView;  pView=(C...View*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveView();当然这些也许都知道是这么用的,但真正的m_pMainWnd和AfxGetApp()是什么意思也许有的人不明白. 大家也许都知道如何在App中获得MainFrame指针(框架类): CWinApp 中的 m_pMainWnd变量就是CMainFrame的指针.所以在别的类下也可以先得到m_pMainWnd,就得到了MainFrame的指针. 所以得到视图类的指针,必先得到CFrameWnd的指针m_pMainWnd,然后在调用FrameWnd下的GetActiveView 就指向当前活动视图. 

m_pMainWnd的由来: 每一个MFC应用程序都有一个CWinApp派生类的对象。这个对象对应着程序的主线程。而 CWinApp 类中有一个 CWnd * m_pMainWnd 成员变量。这个成员变量记录了应用程序的主窗口。 当你新建一个MFC应用程序的时候,在 InitInstance虚函数里都会出现对 m_pMainWnd 赋值的语句.唯一的例外是单文档界面的MFC应用程序,你无法在 InitInstance 函数里看到这段代码,因为它已经被隐藏在 ProcessShellCommand 这个函数里了。由此你就可以下结论:只要创建自己的窗口类,就要把这个类的对象赋值给 m_pMainWnd .而这个成员只能在C...APP类中才可以使用,所以怎样使用这个CWinApp类里的CWnd 类型的变量来得到主框架窗口的指针呢? AfxGetApp函数才可以 , 因为AfxGetApp()得到的是CWinApp类的对象,且AfxGetApp返回值为CWinApp对象指针,就是MFC生成的C**App.cpp中定义的那个对象(对象theApp的指针)。 因为你是在自己创建的项目中得到CWndApp成员函数或者成员变量,所以你必须强制转换为你自己的项目中的类,才能找到成员函数或者变量. 注: 在单文档中,获得视图指针的最简单的方法还是 ((C**View *)CFrameWnd::GetActiveView()) 
    2.当然在FrameWnd中也可以得到文档类的指针:  
CMyDocument* pDoc; 

 pDoc=(CMyDocument*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveDocument();          

3. 由上面可以知道:在View中怎样获得MainFrame指针 CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;

注: 从视图类中获得主窗口类指针:用函数:CWnd::GetParentFrame()或AfxGetMainWnd()也 可达到目的。GetParentFrame()的工作原理是在父窗口链中搜索,直到找到CFrameWnd或其派生类为止,并返回其指针。

((CMainFrame *)CWnd::GetParentFrame()) 或者 ((CMainFrame *)AfxGetMainWnd())          
二: 当然对于MDI程序,由于子窗口才是文档框窗,因此首先要用GetActiveFrame()取得活动子框架窗口,然后通过该子窗口获取活动视图和文档:

CMDIChildWnd* pChild=

(CMDIChildWnd*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveFrame(); 

取得活动视图: CMyView* pView=(CMyView*)pChild->GetActiveView();

取得活动文档: CMyDocument* pDoc=pChild->GetActiveDocument();

注: 也可以用这种方法来得到多文档中的视图指针

 //获得活动子框架窗口 CMDIChildWnd* pChild=(CMDIChildWnd*)GetActiveFrame(); //或: CMDIChildWnd* pChild=MDIGetActive();

 //获得活动子窗口的活动视图 

CMyView* pView=(CMyView*)pChild->GetActiveView();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值