mfc的各大类之间的相互调用

转载 2015年11月18日 18:59:49
例如:我在CMainFrame 中写代码,要访问CVIEW类中的数据,该怎么写代码?
在CMainFrame 中,要访问CDOC类中的数据,该怎么写代码?
CVIEW类要访问CDOC类中的数据,该怎么写代码?
 
假设你是单文档单个VIEW的程序。那么:
1)CMainFrame: 
     GetActiveView()可得到View指针。例如: CyourView   *pView=(CyourView   *)this‐>GetActiveView(); //this即当前CMainFrame,可省略
     GetActiveDocument()可得到Document指针。例如:
         CyourView   *pView=(CyourView   *)this‐>GetActiveView(); //this即当前CMainFrame,可省略
CYourSDIDoc   *pDoc= pView->GetDocument();
     GetMenu()获得菜单指针。例如  CMenu   *pMenu=this->GetMenu();
2)CDoc:
     POSITION pos = GetFirstViewPosition();
     CView* pView = GetNextView(pos); //得到View指针   具体解释见最下方 
     或者     
     CMainFrame   *pMain=(CmaimFrame   *)AfxGetApp()‐>m_pMainWnd;    
     CyourView   *pView=(CyourView   *)pMain‐>GetActiveView(); 
 
3) CView:
     GetDocument()可得到CDoc指针。例如:CYourSDIDoc   *pDoc=this->GetDocument();    //一个视只能有一个文档,this即CView,可省略
     AfxGetMainWnd()可得到MainFrame指针。例如:CMainFrame* pframe=(CMainFrame*)AfxGetMainWnd(); 或者CMainFrame* pframe=(CMainFrame*)AfxGetApp()->m_pMainWnd;
4) CApp:
    成员变量 m_pMainWnd变量就是MainFrame的指针  或者
    CMainFrame   *pMainFrame   =(CMainFrame*)AfxGetMainWnd();或者
    CMainFrame   *pMainframe=(CMainFrame*)AfxGetApp();
5) 在任何类中获得应用程序类    
    用MFC全局函数AfxGetApp()获得
6) 获得状态栏与工具栏指针 
    CStatusBar   *pStatusBar=(CStatusBar   *)AfxGetMainWnd()‐>GetDescendantWindow(AFX_IDW_STATUS_BAR);    
    CToolBar   *pToolBar=(CtoolBar   *)AfxGetMainWnd()‐>GetDescendantWindow(AFX_IDW_TOOLBAR);    

如果框架中加入工具栏和状态栏变量还可以这样      

   (CMainFrame   *)GetParent()‐>m_wndToolBar;    

   (CMainFrame   *)GetParent()‐>m_wndStatusBar; 
 
     POSITION pos = GetFirstViewPosition();
     CView* pView = GetNextView(pos);  的具体解释:

  从文档获得视图类指针目的一般为了控制同一文档的多个视图的定位问题,我的体会    

  特别是文字处理CEditView当产生多个视图类时,这个功能是非常需要的。      

  CDocument类提供了两个函数用于视图类的定位:    

  GetFirstViewPosition()和GetNextView()      

  virtual   POSITION   GetFirstViewPosition()   const;    

  virtual   CView*   GetNextView(POSITION&   rPosition)   const;    

     

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

  GetFirstViewPosition()用于返回第一个视图位置(返回的并非视图类指针,而是一    

  个POSITION类型值),GetNextView()有两个功能:返回下一个视图类的指针以及用    

  引用调用的方式来改变传入的POSITION类型参数的值。很明显,在Test程序中,只有    

  一个视图类,因此只需将这两个函数调用一次即可得到CTestView的指针如下(需定    

  义一个POSITION结构变量来辅助操作):      

  CTestView*   pTestView;    

  POSITION   pos=GetFirstViewPosition();    

  pTestView=GetNextView(pos);    

     

  这样,便可到了CTestView类的指针pTestView.执行完几句后,变量pos=NULL,因为没    

  有下一个视图类,自然也没有下一个视图类的POSITION.但是这几条语句太简单,不    

  具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指    

  定类的指针时,我们需要遍历所有视图类,直到找到指定类为止。判断一个类指针指    

  向的是否某个类的实例时,可用IsKindOf()成员函数时行检查,如:    

    pView‐>IsKindOf(RUNTIME_CLASS(CTestView));    

  即可检查pView所指是否是CTestView类。    

     

  有了以上基础,我们已经可以从文档类取得任何类的指针。为了方便,我们将其作    

  为一个文档类的成员函数,它有一个参数,表示要获得哪个类的指针。实现如下:      

      

  其中用了两次视图类的成员函数IsKindOf()来判断,是因为退出while循环有三种    

  可能:    

     

  1.pos为NULL,即已经不存在下一个视图类供操作;    

  2.pView已符合要求。    

     

  1和2同是满足。这是因为GetNextView()的功能是将当前视图指针改变成一个视图    

  的位置同时返回当前视图指针,因此pos是pView的下一个视图类的POSITION,完全    

  有可能既是pos==NULL又是pView符合需要。当所需的视图是最后一个视图是最后一    

  个视图类时就如引。因此需采用两次判断。    

  使用该函数应遵循如下格式(以取得CTestView指针为例):    

  CTestView*   pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView));    

  RUNTIME_CLASS是一个宏,可以简单地理解它的作用:将类的名字转化为    

  CRuntimeClass为指针。至于强制类型转换也是为了安全特性考虑的,因为从同一个    

  基类之间的指针类型是互相兼容的。这种强制类型转换也许并不必要,但能避免一    

  些可能出现的麻烦。   

c++ 类之间的相互调用问题

这个问题在以前看别人代码的时候看到过类之间的相互调用,但是一直想不通在语法上怎么不会出错。自己试着写一个程序测试了一下。 这里建立两个类。一个是动物,一个是鱼。 1.动物类中有一个成员函数prt(...
  • liunian17
  • liunian17
  • 2012年03月04日 21:05
  • 6858

MFC中常用数据类型之间的相互转换

最近在用MFC开发一个软件,涉及到数据库,Modbus总线通讯,所以不可避免会用到多种数据类型之间的转换,今天就来总结一下,MFC中常用的数据类型以及它们之间的相互转换常用的方法。 为了方便叙述,我在...
  • m0_37949304
  • m0_37949304
  • 2017年07月24日 19:17
  • 79

mfc对话框之间的相互调用

待续
  • chxlj
  • chxlj
  • 2013年10月31日 11:07
  • 189

mfc可执行程序之间的相互调用

调用方法:    CString playexePath= "D:\\work\\study\\newshell\\Debug\\newshell.exe";  CString sParamet...
  • hhhbbb
  • hhhbbb
  • 2012年05月16日 09:11
  • 602

三个类之间的相互调用实现

三个类之间的相互调用         由来:在项目开发的时候,定义了三个核心类(ClassA,ClassB, ClassC),三个类之间存在调用关系如下:ClassC是管理类,需要调用ClassA, ...
  • wojiushiwo987
  • wojiushiwo987
  • 2013年08月10日 01:22
  • 4745

MFC单文档应用程序中各个类之间相互调用的函数方法

如何在MFC单文档中创建多视图 基本步骤如下: 1.首先创建一个MFC单文档应用程序。 2.添加4个MFC类TopLView、BottomLView、TopRView、BottomRView,基...
  • hsy12342611
  • hsy12342611
  • 2013年12月12日 10:33
  • 2529

文档类程序各个类之间的相互访问关系

在实际的应用中,经常需要在多个类之间交换数据,调用另一个类中的函数,框架提供一系列的函数用于多个类之间的交互 1.MFC单文档应用程序的类与类之间的访问 (1)在所有类中获取App指针: ...
  • shaderdx
  • shaderdx
  • 2017年01月08日 23:00
  • 529

模块间互相调用的一种方法

模块间互相调用的一种方法在程序设计中,需要把程序根据功能划分多个模块,多个模块间免不了互相调用一些服务函数,这样会使模块间剪不断,理还乱!利用服务中心的思想,可以使各个模块间的关系比较简单。模块间的调...
  • bat603
  • bat603
  • 2009年06月22日 14:54
  • 4369

在MFC中各种数据类型之间的转换

转载地址:http://blog.csdn.net/bitxinhai/article/details/2292014 CString/string 区别及其转化 ...
  • ljsant
  • ljsant
  • 2016年10月11日 09:05
  • 1281

Objective-C ——一个方法调用另一个方法的简单调用。

#import "Sportsman.h" @implementation Sportsman static int sum; -(void)addCount:(int)a {    ...
  • u012220823
  • u012220823
  • 2013年10月29日 15:53
  • 360
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mfc的各大类之间的相互调用
举报原因:
原因补充:

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