


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、MFC类中获得其它类指针当用VC+的ApplicationWizard生成除了CDialogBasiced以外的应用程序时,将自动产生视图类、文档类、主帧窗口类、应用程序类等等。一般来说,程序的核心数据及操作在文档类中实现。跟界面有关的数据及操作在视图类中实现。当需要在某个类中使用不届丁该类的数据时,必须要取得该数据所届类的指针。从视图类获得文档类的指针是很容易的,用GetDocument即可,这在一般的MFC文档中有介绍,也是编程中极为常用的的操作,比如视图类在进行重画等操作时,往往要用到文档类中的数据。然而只能从视图类获得文档类的指针是远远不够的,每个类都有获得其它各个类指针的一套方法,现
2、归纳如下:为方便说明,现假设已用ApplicationWizard生成一个SDI应用程序Test,包含如一几个类:CTestApp,CTestDoc,CTestView,CMainFrm.字申7从视图类获得文档类的指针字申8如前所述,在视图类中需要引用文档类的地方之前,使用以下语句:CTextDoc*pDoc=(CTestDoc*GetDocument(;以后便可使用pDoc指针访问文档类。此处的强制类型转换在Test应用程序中并不必需,因为该程序中只有一个视图类,并且在Initstance(中用SDI文档模板进行了装配,你可以在Test.cpp中的Initstance优T法中看到以下语句:C
3、SingleDocTemplate*pDocTemplate;pDocTemplate=newCSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CTestDoc,RUNTIME_CLASS(CMainFrame,RUNTIME_CLASS(CTestView;AddDocTemplate(pDocTemplate;以及TestView.h中的线上定义:inlineCTestDoc*CTestView:GetDocument(return(CTestDoc*m_pDocument;简而言之,就是说CTestView的GetDocument(函数自然而然
4、地认为CTestDoc是与它相配”的,当生成了一个具有多个视图类的应用程序时(如用CSplitterWnd将窗口分为两栏,但这两栏并非从同一种视图类派生就届丁这种情况。具体实现在本文讨论范围之外),只有一个视图类能与唯一的文档类用文档模板进行装配,那么在另外一个未经装配的类中要取得文档类的指针,则需时行强制类型转换。字申9从文档类取得视图类的指针字申7CDocument类提供了两个函数用丁视图类的定位:GetFirstViewPosition(和GetNextView(,具体语法如下:virtualPOSITIONGetFirstViewPosition(const;virtualCView*
5、GetNextView(POSITION&rPositionconst;注意:GetNextView(括号中的参数用的是引用方式,因此执行后值可能改变。GetFirstViewPosition(用丁返回第一个视图位置(返回的并非视图类指针,而是一个POSITION类型值),GetNextView(有两个功能:返回下一个视图类的指针以及用引用调动的方式来改变传入的POSITION类型参数的值。很明显,在Test程序中,只有一个视图类,因此只需将这两个函数调用一次即可得到CTestView的指针如下(需定义一个POSITION结构变量来辅助操作):CTestView*pTestView;P
6、OSITIONpos=GetFirstViewPosition(;pTestView=GetNextView(pos;这样,便可到了CTestView类的指针pTestView.执行完成几句后,变量pos=NULL,因为没有下一个视图类,自然也没有下一个视图类的POSITION.字申4但是之几条语句太简单,不具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指定类的指针时,我们需要遍历所有视图类,直到找到指定类为止。判断一个类指针指向的是否某个类的实例时,可用IsKindOf(成员函数时行检查,如:pView->IsKindOf(RUNTIME_CLASS(CTes
7、tView;即可检查pView所指是否是CTestView类。有了以上基础,我们已经可以从文档类取得任何类的指针。为了方便,我们将其作为一个文档类的成员函数,它有一个参数,表示要获得哪个类的指针。实现如下:CView*CTestDoc:GetVieww(CRuntimeClass*pClassCView*pView;POSITIONpos=GetFirstViewPosition(;while(pos!=NULL(pView=GetNextView(pos;if(pView->IsKindOf(pClassbreak;字申3if(!pView->IsKindOf(pClassret
8、urnNULL;returnpView;其中用了两次视图类的成员函数IsKindOf(来判断,是因为退出while循环有三种可能:1. pos为NULL,即已经不存在下一个视图类供操作;pView已符合要求。3.1和2同是满足。这是因为GetNextView(的功能是将当前视图指针改变成一个视图的位置同时返回当前视图指针,因此pos是pView的下一个视图类的POSITION,完全有可能既是pos=NULL乂是pView符合需要。当所需的视图是最后一个视图是最后一个视图类时就如引。因此需采用两次判断。使用该函数应遵循如下格式(以取得CTestView指针为例):CTestView*pTestV
9、iew=(CTestView*GetView(RUNTIME_CLASS(CTestView;RUNTIME_CLASS是一个宏,可以简单地理解它的作用:将类的名字转化为CRuntimeClass为指针。至丁强制类型转换也是为了安全特性考虑的,因为从同一个基类之间的指针类型是互相兼容的。这种强制类型转换也许并不必要,但能避免一些可能出现的麻烦。字申6从一个视图类取得另一视图类的指针字申8综合1和2,很容易得出视图类之间互相获得指针的方法:就是用文档类作中转,先用1的方法得到文档类的指针,再用2的方法,以文档类的视图定位函数取得另一个视图类。同样,可以实现成一个函数:(假设要从CTestAVie
10、w中取得指向其它视图类的指针)CView*CTestAView:GetView(CRuntimeClass*pClassCTestDoc*pDoc=(CTestDoc*GetDocument(;CView*pView;POSITIONpos=pDoc->GetFirstViewPosition(;while(pos!=NULLpView=pDoc->GetNextView(pos;if(pView->IsKindOf(pClassbreak;if(!pView->IsKindOf(pClass字申8returnNULL;returnpView;这个函数和2中的GetVi
11、ew(相比,一是多了第一句以取得文档类指针,二是在GetFirstViewPosition(和GetNextView(前加上了文档类指针,以表示它们是文档类成员函数。有了此函数;当要从CTestAView中取得CTestBView的指针时,只需如下:CTestBView*pTestbView=(CTestView*GetView(RUNTIME_CLASS(CTestBView;字申2从主帧窗口类获得视图类指针字申5对本文所举的Test这各SDI程序来说,这是简单的,只需用CFrameWnd类的GetActiveView(成员函数即可。格式如下:CFrameWnd:GetActiveView(
12、但将此函数应用在MDI应用的CMDIFrameWnd为中时,并不象所想的那样获得当前活动子窗口的视图类,而是返回NULL,这是一个要领性问题。在MDI程序中,CMDIFrameWnd没有和任何视图类发生关系,也就是说没有视图类直接届丁它,只有子帧窗口类CMDIChildWnd才是所有子窗口视图类的父窗口。而子帧窗口的父窗口才是CFrameWndo因此,在MDI程序中获得活动视图类的正确方法应为:先获得活动子帧窗口,再从活动子帧窗口中获得活动视图类:2. 获得活动子帧窗口CMDIChildWnd*pChild=(CMDIChildWnd*GetActiveFrame(;或:CMDIChildWn
13、d*pChild=MDIGetActive(;获得活动子帧窗口的活动视图CMyView*pView=(CMyView*pChild->GetActiveView(;字申7从视图类中获得主帧窗口类指针:字申3用函数:CWnd:GetParentFrame戒AfxGetMainWnd(;可达到目的。GetParentFrame(勺工作原理是在父窗口链中搜索,直到找到CFrameWnd或其派生类为止,并返回其指针。用法在InfoViewer中有详细介绍。字申3在任何类中获得应用程序类用MFC全局函数AfxGetApp(可做到。字申8从应用程序类中获得主帧窗口类CWinThread类有一个数据成员叫m_pMainWnd,由丁CWinApp类由CWinThread派生而来
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年上海安全知识竞赛考试题库及答案
- Unit2 Lesson 4 Running for monitor 说课稿2024-2025学年 冀教版(2024)英语七年级下册
- 管网铺设路由优化与地形适配建设方案
- 老旧小区楼道环境整治管理方案
- 供水管网智慧化运维管理方案
- 经管类课程思政的核心元素与实施路径
- 工程经济学课程教学改革与路径分析
- 2025年度员工借用合同范本
- 2025年内科疾病诊断与治疗挑战性试题答案及解析
- 北京市通州区2024-2025学年八年级下学期期中考试语文考题及答案
- 生育津贴相关管理办法
- 2023-2025年中考语文试题分类汇编:记叙文阅读(辽宁专用)解析版
- 2025年公路检测工程师《水运结构与地基》试题及答案
- 学校食堂从业人员食品安全知识培训考试试题(含答案)
- 电影艺术概述-设计艺术-人文社科-专业资料
- 2025年教科版新教材科学三年级上册全册教案设计(含教学计划)
- 医院药品采购与质量控制规范
- 数控机加工技术知识培训课件
- 从+“心”+出发遇见更好的自己-开学第一课暨心理健康教育主题班会-2025-2026学年高中主题班会
- 隔爆水棚替换自动隔爆装置方案及安全技术措施
- 2025年苏教版新教材数学二年级上册教学计划(含进度表)
评论
0/150
提交评论