在MFC类中各种类的指针的获取和应用

原创 2005年04月26日 16:55:00

 关于MFC下的文档和视图以及框架之间的访问, 这些问题已经是老生常谈了,但我觉得还是都没有详细的说明,特

别是对于英语较差的人,我查看了一些blog,总结了一下!希望对和我一样的人有点帮助!
 一:
      1:   因为对于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();

三:
  1.   从视图类获得文档类的指针 
            在视图类中需要引用文档类的地方之前,使用以下语句:
     C*Doc  *pDoc=(C*Doc*)GetDocument();
     以后便可使用pDoc指针访问文档类。
 2.    从文档类取得视图类的指针 CDocument类提供了两个函数用于视图类的定位:  

   GetFirstViewPosition()和GetNextView()

 注意:GetNextView()括号中的参数用的是引用方式,因此执行后值可能改变.GetFirstViewPosition()用于

返回第一个视图位置(返回的并非视图类指针,而是一个POSITION类型值),GetNextView()有两个功能:返回下一个视图类的指针以及用引用调动的方式来改变传入的POSITION类型参数的值。很明显,在Test程序中,只有一个视图类,因此只需将这两个函数调用一次即可得到CTestView的指针如下(需定义一个POSITION结构变量来辅助操作):

    C*View* pView;
  POSITION pos=GetFirstViewPosition();
  pView=GetNextView(pos);

这样,便可到了C*View类的指针pView.执行完成几句后,变量pos=NULL,因为没有下一个视图类,自然也没有下一个视图类的POSITION.但是之几条语句太简单,不具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指定类的指针时,我们需要遍历所有视图类,直到找到指定类为止。判断一个类指针指向的是否某个类的实例时,可用IsKindOf()成员函数时行检查.

如:
 pView->IsKindOf(RUNTIME_CLASS(C*View));
 即可检查pView所指是否是C*View类。
有了以上基础,我们已经可以从文档类取得任何类的指针。为了方便,我们将其作为一个文档类的成员函数,它有一个参数,表示要获得哪个类的指针。实现如下:
          CView* C*Doc::GetVieww(CRuntimeClass* pClass)
 { CView* pView;
 POSITION pos=GetFirstViewPosition();
 while(pos!=NULL){
 pView=GetNextView(pos);
 if(!pView->IsKindOf(pClass))
 break;}
 if(!pView->IsKindOf(pClass)){
 AfxMessageBox("Connt Locate the View.");
 return NULL;}
 return pView;}
其中用了两次视图类的成员函数IsKindOf()来判断,是因为退出while循环有三种可能:
1.pos为NULL,即已经不存在下一个视图类供操作;
2.pView已符合要求。
3.1和2同是满足。这是因为GetNextView()的功能是将当前视图指针改变成一个视图的位置同时返回当前视图指针,因此pos是pView的下一个视图类的POSITION,完全有可能既是pos==NULL又是pView符合需要。当所需的视图是最后

一个视图是最后一个视图类时就如引。因此需采用两次判断。
使用该函数应遵循如下格式(以取得CTestView指针为例):
CTestView* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView));
RUNTIME_CLASS是一个宏,可以简单地理解它的作用:将类的名字转化为CRuntimeClass为指针。
至于强制类型转换也是为了安全特性考虑的,因为从同一个基类之间的指针类型是互相兼容的。这种强制类型转换也许并不必要,但能避免一些可能出现的麻烦

 

MFC中文档框架视类指针的相互获取

只考虑文档、视图和框架窗口间的关系,常用的指针获取方法如下: 全局函数AfxGetApp可以得到CWinApp应用类指针 AfxGetApp()->m_pMainWnd为框架窗口指针 在框架...
  • stardust94605
  • stardust94605
  • 2014年03月11日 17:59
  • 2819

MFC获取视图类指针

一个基于SDI的应用程序,自己写了一个general类,该类需要获取视图类传过来的值, 或者需要调用View类的某个成员函数,此时,我们就需要获取View类的指针~~ 该类的函数中,添加如下代码:...
  • foreverhuylee
  • foreverhuylee
  • 2014年03月27日 20:44
  • 915

MFC View类对话框类之间指针的相互获取

这里主要是总结一下我自己用到过的不同类之间指针的获取方法: 1.基于对话框的应用程序,通过菜单命令来显示一个模态对话框: 该模态对话框如何获取主对话框的指针,在模态对话框类需要调用主对话框...
  • zhonglixianyun
  • zhonglixianyun
  • 2017年07月31日 19:13
  • 476

在对话框类中如何获得视类和文档类的指针

最近遇到了一个问题在对话框类源文件的函数中来更改文档类和视类中的变量值的问题,总结了一下,解决办法如下: 1)添加MainFrame.h,MyDoc.h,MyView.h三个头文件; 2)获得相应...
  • huangtaibin
  • huangtaibin
  • 2015年04月14日 19:08
  • 429

MFC获取主框架,文档,视图的指针

如何获得当前程序的视图,文档指针 首先需要在头文件中,包含CMainFrm.h 方法1: 1)获取当前框架的指针 CMainFrame* pFrame = ...
  • qqqren
  • qqqren
  • 2016年11月25日 18:03
  • 961

在MFC类中各种类的指针的获取和应用 (2)

 关于MFC下的文档和视图以及框架之间的访问, 这些问题已经是老生常谈了,但我觉得还是都没有详细的说明,特    别是对于英语较差的人,我查看了一些blog,总结了一下!希望对和我一样的人有点帮助! ...
  • yangsen2016
  • yangsen2016
  • 2007年06月07日 08:37
  • 2013

在MFC类中各种类的指针的获取和应用

关于MFC下的文档和视图以及框架之间的访问, 这些问题已经是老生常谈了,但我觉得还是都没有详细的说明,特别是对于英语较差的人,我查看了一些blog,总结了一下!希望对和我一样的人有点帮助! 一:   ...
  • sxslyy
  • sxslyy
  • 2007年06月30日 12:06
  • 606

在MFC类中各种类的指针的获取和应用

关于MFC下的文档和视图以及框架之间的访问, 这些问题已经是老生常谈了,但我觉得还是都没有详细的说明,特别是对于英语较差的人,我查看了一些blog,总结了一下!希望对和我一样的人有点帮助! 一:   ...
  • firectrl
  • firectrl
  • 2007年09月21日 19:04
  • 416

VC其它- 在MFC类中各种类的指针的获取和应用

在MFC类中各种类的指针的获取和应用关于MFC下的文档和视图以及框架之间的访问, 这些问题已经是老生常谈了,但我觉得还是都没有详细的说明,特    别是对于英语较差的人,我查看了一些blog,总结了一...
  • MasterFT
  • MasterFT
  • 2007年05月15日 15:58
  • 1270

在MFC类中各种类的指针的获取和应用 .

1:   因为对于SDI程序,主框架窗口就是文档框窗(如果这个也不知道,就要查看一下MFC下的单文档的构成原理了).           下面所说的是关于单文档的.              ...
  • myiszjf
  • myiszjf
  • 2013年08月19日 17:43
  • 391
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在MFC类中各种类的指针的获取和应用
举报原因:
原因补充:

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