MFC中的MainFrame Dlg,App,Doc,View的关系



http://www.cnblogs.com/areliang/archive/2011/11/17/2252901.html

MainFrame: 主框架类

Dlg 是Dialog 的缩写,表示对话框本身

 
App类就是这个SDI作为"程序"的入口,有点像c的Main函数,它不是从CWND中派生出来的。App表示应用程序本身。

 
View表示视图类,负责显示数据,提供编辑数据、修改数据的功能。它是指编辑区里面的事就是那块白色的中间区域,负责绘制和响应一些消息

 
Doc表示文档类,提供对数据的保存和加载。有点像数据库,保存着编辑数据,用于view的Redraw的时候用,还有保存文件。

 一般动态的编辑数据都放在Doc里面。他也不是从CWND中派生出来的,没有继承MessageBox函数,可以用AfxMessageBox函数。

 

 

1)   在View中获得Doc指针    

  2)   在App中获得MainFrame指针    

  3)   在View中获得MainFrame指针    

  4)   获得View(已建立)指针    

  5)   获得当前文档指针    

  6)   获得状态栏与工具栏指针    

  7)   获得状态栏与工具栏变量    

  8)   在Mainframe获得菜单指针    

  9)   在任何类中获得应用程序类    

  10)   从文档类取得视图类的指针(1)    

  11)   在App中获得文档模板指针    

  12)   从文档模板获得文档类指针    

  13)   在文档类中获得文档模板指针    

  14)   从文档类取得视图类的指针(2)    

  15)   从一个视图类取得另一视图类的指针    

     

  VC中编程对于刚刚开始学习的同学,最大的障碍和问题就是消息机制和指针获取与操作。其实这些内容基本上是每本VC学习工具书上必讲的内容,而且通过MSDN很多问题都能解决。下面文字主要是个人在编程中指针使用的一些体会,说的不当的地方请指正。一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针获取和操作问题。下面这节内容主要是一般的框架,然后再讲多线程中的指针使用。使用到的类需要包含响应的头文件。首先一般获得本类(视,文档,对话框都支持)实例指针this,用this的目的,主要可以通过类中的函数向其他类或者函数中发指针,以便于在非本类中操作和使用本类中的功能。 

    1   View中获得Doc指针    

CYouSDIDoc   *pDoc=GetDocument();一个视只能有一个文档。    

    2)   App中获得MainFrame指针    

  CWinApp   中的   m_pMainWnd变量就是MainFrame的指针    

  也可以:   CMainFrame   *pMain   =(CMainFrame   *)AfxGetMainWnd(); 

    3)   View中获得MainFrame指针 

  CMainFrame   *pMain=(CmaimFrame   *)AfxGetApp()‐>m_pMainWnd; 

    4)   获得View(已建立)指针 

  CMainFrame   *pMain=(CmaimFrame   *)AfxGetApp()‐>m_pMainWnd;    

  CyouView   *pView=(CyouView   *)pMain‐>GetActiveView(); 

    5)   获得当前文档指针 

  CDocument   *   pCurrentDoc   =(CFrameWnd   *)m_pMainWnd‐>GetActiveDocument(); 

    6)   获得状态栏与工具栏指针 

  CStatusBar   *   pStatusBar=(CStatusBar   *)AfxGetMainWnd()‐>GetDescendantWindow(AFX_IDW_STATUS_BAR);    

  CToolBar   *   pToolBar=(CtoolBar   *)AfxGetMainWnd()‐>GetDescendantWindow(AFX_IDW_TOOLBAR);    

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

  (CMainFrame   *)GetParent()‐>m_wndToolBar;    

  (CMainFrame   *)GetParent()‐>m_wndStatusBar;    

    8)   Mainframe获得菜单指针 

  CMenu   *pMenu=m_pMainWnd‐>GetMenu(); 

    9)   在任何类中获得应用程序类    

  用MFC全局函数AfxGetApp()获得。    

  10)   从文档类取得视图类的指针    

  我是从http://download.cqcnc.com/soft/program/article/vc/vc405.html学到的,    

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

  特别是文字处理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为指针。至于强制类型转换也是为了安全特性考虑的,因为从同一个    

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

  些可能出现的麻烦。    

     

  3.从一个视图类取得另一视图类的指针   综合1和2,很容易得出视图类之间互相获得    

  指针的方法:就是用文档类作中转,先用1的方法得到文档类的指针,再用2的方法,    

  以文档类的视图定位函数取得另一个视图类。同样,可以实现成一个函数:    

  (假设要从CTestAView中取得指向其它视图类的指针)    

   这个函数和2中的GetView()相比,一是多了第一句以取得文档类指针,二是在    

  GetFirstViewPosition()和GetNextView()前加上了文档类指针,以表示它们是文档    

  类成员函数。有了此函数;当要从CTestAView中取得CTestBView的指针时,只需如    

  下:CTestBView*   pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView)); 


//-------------------------------------------------


AfxGetApp()->GetMainWnd() 获取的是主线程的窗口句柄。

AfxGetMainWnd()获取的是所在线程的窗口句柄。


//---------------------------------------------------

extern C×××App theApp; 这句话~~

如果在C类中也想调用,则也要在C类的头文件中,加上extern C×××App theApp;

这样做的好处是,在某一个类中定义的函数或变量,在其他类中都可以使用,并且不用对原来那个类进行实例化


//-----------------------------------------------------

CSDN中对theApp的用法的总结:

1.theApp是你工程的头,你可以通过AfxGetApp()获得整个进程的指针,然后通过它,可以获得该进程的HWND以及HINSTANCE,和菜单。。。等等。不一而足。可以通过msdn获得更多的信息

 

2.theApp是个全局变量,几乎可以在程序的任何地方引用。如果你建立一个MDI或者SDI工程,那么,你可以看到一个类以*App结尾,这个theApp就是它的一个实例,在这个类中添加的public变量可以通过theApp引用。当然,由于WinApp是它的基类,theApp保存有许多有关程序运行期间的很多信息,如执行程序名,路径什么的。

 

3.加个成员及方法,可以随时用AfxGetApp访问

 

4.theApp是CWinApp类的派生类的对象,是一个全局变量。全局变量在WinMain()前被创建。

 

5.theApp就是应用程序的实例,没有他你就什么都不能做啊!他初始了进程啊!







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值