关于MFC自动生成的各个类的指针访问
2007-10-20 13:27
267 查看
经常看到有朋友在问这个问题,在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();
当然程序的应用可能不只这些,不过只要掌握以上这些访问的方法,我想其他的应该一能百通了吧.
以下为例,如果说我给工程取的名称为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();
当然程序的应用可能不只这些,不过只要掌握以上这些访问的方法,我想其他的应该一能百通了吧.
相关文章推荐
- 关于MFC自动生成的各个类的指针访问
- 关于MFC自动生成的各个类的指针访问
- MFC关于自动填表
- 关于MyEclipse中Hibernate实现数据库和到工程文件实体类的映射,自动生成POJO
- 关于myesclipse下没有自动生成web.xml的问题
- 实现手机扫描二维码页面登录,类似web微信-第二篇,关于二维码的自动生成
- JAXB注解 java 关于xml的注解,自动生成xml文件 - @XML***
- 在新复制的MFC Visual C++项目中不能自动生成代码问题的解决
- 关于asp.net上传图片自动生成缩略图
- 关于绑定自动生成的下拉式菜单的错误
- 关于Hibernate自动生成表的实体类时,出现两个java文件的解决办法
- 关于在VC++ 的MFC 下INI文件的生成和运用
- 关于Linux的makefile的自动生成,以及.configure及编译选项
- 关于appfuse里自动生成的tablemanager的使用问题
- 关于linq 的dbml自动生成的表对象带s和不带s的问题
- 关于SQL语句的自动生成!(四)
- android 照相以及关于自动生成的图片分辨率和面积太小问题 (转)
- 关于Aptana Studio生成自动备份文件的解决办法
- 关于jeecg自动生成代码后,进入前端页面后后端报错的问题
- 关于HTML静态页面(含自动分页)生成的可行性方案