按关键词阅读: 文库 其它 获得 指针 百度 MFC
1、MFC类中获得其它类指针当用VC+的Application Wizard生成除了 CDialog Basiced以外的应用程序时 , 将 自动产生视图类、文档类、主帧窗口类、应用程序类等等 。
一般来说 , 程序的核心 数据及操作在文档类中实现 。
跟界面有关的数据及操作在视图类中实现 。
当需要在 某个类中使用不属于该类的数据时 , 必须要取得该数据所属类的指针 。
从视图类获 得文档类的指针是很容易的 , 用 GetDocument即可 , 这在一般的MFC文档中有介 绍 , 也是编程中极为常用的的操作 , 比如视图类在进行重画等操作时 , 往往要用到 文档类中的数据 。
然而只能从视图类获得文档类的指针是远远不够的 , 每个类都有 获得其它各 。
【MFC|MFC类中获得其它类指针_百度文库】2、个类指针的一套方法 , 现归纳如下:为方便说明 , 现假设已用 Application Wizard生成一个SDI应用程序Test,包含如 一几个类:CTestApp,CTestDoc,CTestView,CMainFrm.字用 71 .从视图类获得文档类的指针字用8如前所述 , 在视图类中需要引用文档类的地方之前 , 使用以下语句:CTextDoc*pDoc=(CTestDoc*GetDocument(;
以后便可使用pDoc指针访问文档类 。
此处的强制类型转换在Test应用程序中并不必需 , 因为该程序中只有一个视图 类 , 并且在Initstance(中用SDI文档模板进行了装配 , 你可以在 Test.cpp中的 I 。
3、nitstanceCT法中看到以下语句:CSingleDocTemplate*pDocTemplate;
pDocTemplate=newCSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CTestDoc,RUNTIME_ CLASS(CMainFrame,RUNTIME_CLASS(CTestView;
AddDocTemplate(pDocTemplate;
以及TestView.h中的线上定义:inline CTestDoc*CTestView二GetDocument(return(CTestDoc*m_pDocument;
简而言之 , 就是说 CTes 。
4、tView的GetDocument(函数自然而然地认为 CTestDoc是与 它相配”的 , 当生成了一个具有多个视图类的应用程序时(如用 CSplitterWnd将窗 口分为两栏 , 但这两栏并非从同一种视图类派生就属于这种情况 。
具体实现在本文讨论范围之外) , 只有一个视图类能与唯一的文档类用文档模板进行装配 , 那么在 另外一个未经装配的类中要取得文档类的指针 , 则需时行强制类型转换 。
字用92 .从文档类取得视图类的指针字用 7CDocument类提供了两个函数用于视图类的定位:GetFirstViewPosition(和GetNextView( , 具体语法如下:virtual POSITION GetFi 。
5、rstViewPosition(const;
virtual CView*GetNextView(POSITION&rPositionconst;
注意:GetNextView(括号中的参数用的是引用方式 , 因此执行后值可能改变 。
GetFirstViewPosition(用于返回第一个视图位置(返回的并非视图类指针 , 而是一 个POSITION类型值) , GetNextView(有两个功能:返回下一个视图类的指针以及 用引用调动的方式来改变传入的 POSITION类型参数的值 。
很明显 , 在 Test程序 中 , 只有一个视图类 , 因此只需将这两个函数调用一次即可得到CTestView的指针如下(需定义一个POS 。
6、ITION结构变量来辅助操作):CTestView*pTestView;
POSITION pos=GetFirstViewPosition(;
pTestView=GetNextView(pos;
这样 , 便可到了 CTestView类的指针pTestView.执行完成几句后 , 变量pos=NULL, 因为没有下一个视图类 , 自然也没有下一个视图类的POSITION.字用4但是之几条语句太简单 , 不具有太强的通用性和安全特征;当象前面说的那样 , 当 要在多个视图为中返回某个指定类的指针时 , 我们需要遍历所有视图类 , 直到找到 指定类为止 。
判断一个类指针指向的是否某个类的实例时 , 可用 IsKindOf(成员函 数 。
7、时行检查 , 如:pView-IsKindOf(RUNTIME_CLASS(CTestView;
即可检查pView所指是否是CTestView类 。
有了以上基础 , 我们已经可以从文档类取得任何类的指针 。
为了方便 , 我们将其作 为一个文档类的成员函数 , 它有一个参数 , 表示要获得哪个类的指针 。
实现如下:CView*CTestDoc:GetVieww(CRuntimeClass*pClassCView*pView;
POSITION pos=GetFirstViewPosition(;
while(pos!=NULLpView=GetNextView(pos;
if(pView-IsKindOf(pClassbrea 。
8、k;
字用3if(!pView-IsKindOf(pClassreturn NULL;
return pView;
其中用了两次视图类的成员函数IsKindOf(来判断 , 是因为退出while循环有三种 可能:1 .pos为NULL,即已经不存在下一个视图类供操作;2 .pView已符合要求 。
3.1和2同是满足 。
这是因为GetNextView(的功能是将当前视图指针改变成一个视 图的位置同时返回当前视图指针 , 因此 pos是pView的下一个视图类的POSITION, 完全有可能既是pos=NULL又是pView符合需要 。
稿源:(未知)
【傻大方】网址:/a/2021/0905/0024107193.html
标题:MFC|MFC类中获得其它类指针_百度文库