大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> MFC类中获得其它类指针 

MFC类中获得其它类指针 

时间: 2021-07-31 作者:daque

作家:圪塔        当用vc++的application wizard天生除去cdialog basiced除外的运用步调时,将机动爆发视图类、文书档案类、主帧窗口类、运用步调类之类。普遍来说,步调的中心数据及操纵在文书档案类中实行。跟界面相关的数据及操纵在视图类中实行。当须要在某个类中运用不属于该类的数据时,必需要博得该数据分属类的南针。从视图类赢得文书档案类的南针是很简单的,用getdocument即可,这在普遍的mfc文书档案中有引见,也是编制程序中极为常用的的操纵,比方视图类在举行重画等操纵时,常常要用到文书档案类中的数据。但是只能从视图类赢得文书档案类的南针是远远不够的,每个类都有赢得其它各个类南针的一套本领,现归结如次: 为简单证明,现假如已用application wizard天生一个sdi运用步调test,包括如一几个类:ctestapp,ctestdoc,ctestview,cmainfrm.1.从视图类赢得文书档案类的南针 如前所述,在视图类中须要援用文书档案类的场合之前,运用以次语句: ctextdoc *pdoc=(ctestdoc*)getdocument(); 此后便可运用pdoc南针考察文书档案类。         此处的强迫典型变换在test运用步调中并不必定,由于该步调中惟有一个视图类,而且在initstance()顶用sdi文书档案沙盘举行了安装,你不妨在test.cpp中的initstance()本领中看到以次语句: csingledoctemplate *pdoctemplate; pdoctemplate=new csingledoctemplate(idr_mainframe,runtime_class(ctestdoc),runtime_class(cmainframe), runtime_class(ctestview)); adddoctemplate(pdoctemplate); 以及testview.h中的线上设置: inline ctestdoc* ctestview::getdocument() { return (ctestdoc*)m_pdocument;}        简而言之,即是说ctestview的getdocument()因变量自但是然地觉得ctestdoc是与它“相称”的,当天生了一个具备多个视图类的运用步调时(如用csplitterwnd)将窗口分为两栏,但这两栏并非从同一种视图类派生就属于这种情景。简直实行在正文计划范畴除外),惟有一个视图类能与独一的文书档案类用文书档案沙盘进行囊配,那么在其余一个一经安装的类中要博得文书档案类的南针,则需时行强迫典型变换。2.从文书档案类博得视图类的南针 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类。         有了之上普通,咱们仍旧不妨从文书档案类博得任何类的南针。为了简单,咱们将其动作一个文书档案类的分子因变量,它有一个参数,表白要赢得哪个类的南针。实行如次: cview* ctestdoc::getvieww(cruntimeclass* pclass) { cview* pview; position pos=getfirstviewposition(); while(pos!=null){ pview=getnextview(pos); if(!pview->iskindof(pclass)) break;} if(!pview->iskindof(pclass)){ afxmessagebox("connt locate the view."); return null;} return pview;} 个中用了两次视图类的分子因变量iskindof()来确定,是由于退出while轮回有三种大概: 1.pos为null,即仍旧不存鄙人一个视图类供操纵; 2.pview已适合诉求。 3.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中博得指向其它视图类的南针) cview* ctestaview::getview(cruntimeclass* pclass) { ctestdoc* pdoc=(ctestdoc*)getdocument(); cview* pview; position pos=pdoc->getfirstviewposition(); while(pos!=null){ pview=pdoc->getnextview(pos); if(!pview->iskindof(pclass)) break;} if(!pview->iskindof(pclass)){ afxmessagebox("connt locate the view."); return null;} return pview;} 这个因变量和第22中学的getview()比拟,一是多了第一句以博得文书档案类南针,二是在getfirstviewposition()和getnextview()前加上了文书档案类南针,以表白它们是文书档案类分子因变量。 有了此因变量;当要从ctestaview中博得ctestbview的南针时,只需如次: ctestbview* ptestbview=(ctestview*)getview(runtime_class(ctestbview));4. 从主帧窗口类赢得视图类南针 对正文所举的test这各sdi步调来说,这是大略的,只需用cframewnd类的getactiveview()分子因变量即可。方法如次: cframewnd::getactiveview() 但将此因变量运用在mdi运用的cmdiframewnd为中时,并不象所想的那么赢得暂时震动子窗口的视图类,而是归来null,这是一个办法性题目。在mdi步调中,cmdiframewnd没有和任何视图类爆发联系,也即是说没有视图类径直属于它,惟有子帧窗口类cmdichildwnd才是一切子窗口视图类的父窗口。而子帧窗口的父窗辩才是cframewnd。所以,在mdi步调中赢得震动视图类的精确本领应为:先赢得震动子帧窗口,再从震动子帧窗口中赢得震动视图类: //赢得震动子帧窗口 cmdichildwnd* pchild=(cmdichildwnd*)getactiveframe(); //或:cmdichildwnd* pchild=mdigetactive(); //赢得震动子帧窗口的震动视图 cmyview* pview=(cmyview*)pchild->getactiveview();5.从视图类中赢得主帧窗口类南针:用因变量:cwnd::getparentframe()或afxgetmainwnd(); 可到达手段。getparentframe()的处事道理是在父窗口链中探求,直到找到cframewnd或其派生类为止,并归来其南针。用法在infoviewer中有精细引见。6.在任何类中赢得运用步调类 用mfc全部因变量afxgetapp()可做到。7.从运用步调类中赢得主帧窗口类 cwinthread类有一个数据分子叫m_pmainwnd,因为cwinapp类由cwinthread派生而来,咱们的运用步调为又由cwinapp派生而来,以是咱们的ctestapp类也有一个m_pmainwnd分子,它所指南的即是cmainframe类。(需举行符合的强迫典型变换)。归纳起来有几点提防: a.在类a中赢得类b的南针时,类a应包括类b的头文献。 b.在很多功夫要举行强迫典型变换,并要提防括号的括法。 因为派生类和父类南针典型的兼容,使精确辨别各个类变得格外要害。在拿不准的功夫,最佳加上强迫典型变换。 

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.