关于MFC自动生成的各个类的指针访问

转载 2012年03月29日 16:56:20


经常看到有朋友在问这个问题,在MFC自动生成的类中,如果想从一个类中,直接访问另一个类中的成员函数与成员变量该怎么办呢?

今天我就这个问题来详细的说明一下.以下为例,如果说我给工程取的名称为PanelBuilder,如果我选的是单视图(这里主要是将要生成的CLeftView区分,指仅仅是一个视图没有分割窗体),那么MFC会生成以下几个名称的类:

   1.CPanelBuilderApp 这个是应用程序的入口类
   2.CPanelBuilderView 这个是视图类
   3.CPanelBuilderDoc  这个是与视图交互信息的文档类
   4.CMainFrame 这个是主框架类

当然还自动生成了一个about对话框类,用来显示版本信息,这里我们不讨论这个类.下面切入正题.

1.如何从其他类中访问CPanelBuilderView的方法?

((CPanelBuilderView *)(AfxGetApp()->m_pMainWnd))->Function();

对于单视图来说m_pMainWnd就是指的这个视图的指针,然后强制转换后即可用

2.对于多视图的怎么办呢?比如说我左边有一个CLeftView的怎么办?

      2.1如何从CLeftView中访问CPanelBuilderView的方法?

  这样的话,是用到了分割窗体,所以在CMainFrame中会有一个私有的成员变量叫做m_SpliterWnd,这个指针指的是整个的视图,我们先要将其改成公有的,然后再CLeftView中这样写:

((CPanelBuilderView*)(((CMainFrame*)(AfxGetApp()->m_pMainWnd))->m_SpliterWnd).GetPane(0,1))->Function()

即可;

呵呵,是不是很晕?让我来解释一下吧.AfxGetApp()->m_pMainWnd得到CMainFrame的指针,强制转换后调用 m_SpliterWnd这个成员变量的方法GetPane(int,int),在分割窗体中,窗体的标识是从上到下,从左到右的顺序按(0,0), (0,1)等等标识的,我们要得到的CPanelBuilderView这个窗体的指针是(0,1)得到后再强制转换一次即可.

  2.2那么从别的类中访问CLeftView怎么办呢?

((CPanelBuilderView*)(((CMainFrame*) (AfxGetApp()->m_pMainWnd))->m_SpliterWnd).GetPane(0,0))->Function()

即可。因为CLeftView是第零行,第零列.

3.如果是基于对话框的程序呢?
     其实它是和基于视图的类似,细心的朋友可能会发现,在其于对话框的APP中会有这一行代码
     CPanelRunnerDlg dlg;
     m_pMainWnd = &dlg;
     int nResponse = dlg.DoModal();   
     看到了么?说明可以直接用m_pMainWnd来访问DLG中的成员变量,与成员方法,想在其他类中使用DLG的方法这样写就好

((CPanelBuilderDLG *)(AfxGetApp()->m_pMainWnd))->Function();
     
     当然程序的应用可能不只这些,不过只要掌握以上这些访问的方法,我想其他的应该一能百通了吧.

转自:http://blog.csdn.net/xfrunning/archive/2007/10/20/1834231.aspx    

C++ MFC 其他函数获得主对话框指针并使用成员的方法

A.子对话框得到父对话框的方法(此方法也可以帮助其他函数获得主对话框) 1. extern CMainApp theApp; CMainDlg* dlg = (CMainDlg*)theApp.m...
  • xin_yu_xin
  • xin_yu_xin
  • 2015年05月04日 10:49
  • 5600

MFC中获取App,MainFrame,Doc和View类等指针的方法

From: http://hi.baidu.com/wxnxs/item/156a68f5b3b4ed18e3e3bd03 MFC中获取App,MainFrame,Doc和View类等指针的方法...
  • puncha
  • puncha
  • 2013年12月18日 14:54
  • 1787

谈谈基类与子类的this指针(C++)

记得孙鑫VC++视频教程里有一段剖析MFC的代码,大意就是 CTESTAPP类是CWINAPP的子类,而CTESTAPP创建一个全局对象时,在CWINAPP的构造函数里面用了this指针,但是这里th...
  • ningyaliuhebei
  • ningyaliuhebei
  • 2014年12月31日 10:49
  • 3770

MFC自动生成代码详解(一)

首先声明这篇博客是给MFC刚刚上路的coder准备的,老鸟们就自觉无视我吧! 大家有没有感觉,创建MFC工程时他总会生成一大堆文件一大堆代码。虽然给我们带来了便利,但是调试的时候碰到这些代码总是畏...
  • crbrave
  • crbrave
  • 2013年04月12日 20:57
  • 1667

VS2010 MFC:“Debug Assertion Failed!” ——自动生成的单文档程序项目编译运行就有错

VS2010,单文档应用程序,项目文件命名为File,也就有了自动生成的CFileDoc、CFileView等类,一进去就编译运行(就是最初自动生成的项目),编译通过,可运行时直接弹出错误框: Deb...
  • duobaodaoren456
  • duobaodaoren456
  • 2017年07月26日 23:07
  • 283

MFC:“Debug Assertion Failed!” ——自动生成的单文档程序项目编译运行就有错误

今天照着孙鑫老师的VC++教程学习文件的操作,VS2010,单文档应用程序,项目文件命名为File,也就有了自动生成的CFileDoc、CFileView等类,一进去就编译运行(就是最初自动生成的项目...
  • KDTMAC
  • KDTMAC
  • 2017年03月05日 00:06
  • 181

MFC三层标准版模板组件V1.5-自动生成三层VC++非托管源码

  • 2012年10月06日 23:50
  • 176KB
  • 下载

wsdl自动生成web service的client和server,Java类详解,以及webservice访问

wsdl的结构:      xmln:soap="soap命名空间"      xmlns:tns="自定义schema命名空间"      xmlns:xsd="http://www....
  • douniwan740
  • douniwan740
  • 2014年02月22日 15:13
  • 1279

MFC中自动创建的各个类之间的关系和指针获取方法

MainFrame: 主框架类 Dlg 是Dialog 的缩写,表示对话框本身   App类就是这个SDI作为"程序"的入口,有点像c的Main函数,它不是从CWND中派生出来的。App表示应用...
  • hanyang291
  • hanyang291
  • 2013年09月05日 11:56
  • 275

数据建模(自动生成数据访问层)

  • 2011年05月24日 11:37
  • 54KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于MFC自动生成的各个类的指针访问
举报原因:
原因补充:

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