在MFC类中各种类的指针的获取和应用

上传人:仙*** 文档编号:32109338 上传时间:2021-10-13 格式:DOC 页数:3 大小:34.50KB
收藏 版权申诉 举报 下载
在MFC类中各种类的指针的获取和应用_第1页
第1页 / 共3页
在MFC类中各种类的指针的获取和应用_第2页
第2页 / 共3页
在MFC类中各种类的指针的获取和应用_第3页
第3页 / 共3页
资源描述:

《在MFC类中各种类的指针的获取和应用》由会员分享,可在线阅读,更多相关《在MFC类中各种类的指针的获取和应用(3页珍藏版)》请在装配图网上搜索。

1、关于mfc下的文档和视图以及框架之间的访问, 这些问题已经是老生常谈了,但我觉得还是都没有详细的说明,特别是对于英语较差的人,我查看了一些blog,总结了一下!希望对和我一样的人有点帮助! 一: 1: 因为对于sdi程序,主框架窗口就是文档框窗(如果这个也不知道,就要查看一下mfc下的单文档的构成原理了). 下面所说的是关于单文档的. 例子: 在cmainframe框架中如何得到视图类的指针. 可以 先得到框架指针,然后调用 getactiveview 函数指向当前活动视. c *view * pview; pview=(c*view*)(cframewnd*)afxgetapp()-m_pm

2、ainwnd)-getactiveview(); 当然这些也许都知道是这么用的,但真正的m_pmainwnd和afxgetapp()是什么意思也许有的人不明白. 大家也许都知道如何在app中获得mainframe指针(框架类): cwinapp 中的 m_pmainwnd变量就是cmainframe的指针所以在别的类下也可以先得到m_pmainwnd,就得到了mainframe的指针. 所以得到视图类的指针,必先 得到cframewnd的指针m_pmainwnd,然后在调用framewnd下的getactiveview 就指向当前活动视. m_pmainwnd的由来: 每一个mfc应用程序都有

3、一个cwinapp派生类的对象。这个对象对应着程序的主线程。而 cwinapp 类中有一个 cwnd * m_pmainwnd 成员变量。这个成员变量记录了应用程序的主窗口。 当你新建一个mfc应用程序的时候,在 initinstance虚函数里都会出现对 m_pmainwnd 赋值的语句.唯一的例外是单文档界面的mfc应用程序,你无法在 initinstance 函数里看到这段代码,因为它已经被隐藏在 processshellcommand 这个函数里了。由此你就可以下结论了:只要创建自己的窗口类,就要把这个类的对象赋值给 m_pmainwnd .而这个成员只能在c*app类中才可以使用,所

4、以怎样使用这个cwinapp类里的cwnd 类型的变量来得到主框架窗口的指针呢? afxgetapp函数才可以 , 因为afxgetapp()得到的是cwinapp类的对象,且afxgetapp返回值为cwinapp对象指针,就是mfc生成的c*app.cpp中定义的那个对象(对象theapp的指针)。 因为你是在自己创建的项目中得到cwndapp成员函数或者成员变量,所以你必须强制转换为你自己的项目中的类,才能找到成员函数或者变量. 注: 在单文档中,获得视指针的最简单的方法还是 (c*view *)cframewnd:getactiveview() 2: 当然在framewnd中也可以得到

5、文档类的指针: cmydocument* pdoc; pdoc=(cmydocument*)(cframewnd*)afxgetapp()-m_pmainwnd)-getactivedocument(); 3: 由上面可以知道:在view中怎样获得mainframe指针 cmainframe *pmain=(cmainframe *)afxgetapp()-m_pmainwnd; 注: 从视图类中获得主帧窗口类指针:用函数:cwnd:getparentframe()或afxgetmainwnd()也可达到目的。getparentframe()的工作原理是在父窗口链中搜索,直到找到cframew

6、nd或其派生类为止,并返回其指针。 (cmainframe *)cwnd:getparentframe() 或者 (cmainframe *)afxgetmainwnd() 二: 当然对于mdi程序,由于子窗口才是文档框窗,因此首先要用getactiveframe()取得活动子框架窗口,然后通过该子窗口获取活动视图和文档: cmdichildwnd* pchild=(cmdichildwnd*)(cframewnd*)afxgetapp()-m_pmainwnd)- getactiveframe(); 取得活动视图: cmyview* pview=(cmyview*)pchild-getact

7、iveview(); 取得活动文档: cmydocument* pdoc=pchild-getactivedocument(); 注: 也可以用这种方法来得到多文档中的视指针 /获得活动子框架窗口 cmdichildwnd* pchild=(cmdichildwnd*)getactiveframe(); /或: cmdichildwnd* pchild=mdigetactive(); /获得活动子帧窗口的活动视图 cmyview* pview=(cmyview*)pchild-getactiveview();三: 1. 从视图类获得文档类的指针 在视图类中需要引用文档类的地方之前,使用以下语句

8、: c*doc *pdoc=(c*doc*)getdocument(); 以后便可使用pdoc指针访问文档类。 2. 从文档类取得视图类的指针 cdocument类提供了两个函数用于视图类的定位: getfirstviewposition()和getnextview() 注意:getnextview()括号中的参数用的是引用方式,因此执行后值可能改变.getfirstviewposition()用于返回第一个视图位置(返回的并非视图类指针,而是一个position类型值),getnextview()有两个功能:返回下一个视图类的指针以及用引用调动的方式来改变传入的position类型参数的值。

9、很明显,在test程序中,只有一个视图类,因此只需将这两个函数调用一次即可得到ctestview的指针如下(需定义一个position结构变量来辅助操作): c*view* pview; position pos=getfirstviewposition(); pview=getnextview(pos);这样,便可到了c*view类的指针pview.执行完成几句后,变量pos=null,因为没有下一个视图类,自然也没有下一个视图类的position.但是之几条语句太简单,不具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指定类的指针时,我们需要遍历所有视图类,直到找到

10、指定类为止。判断一个类指针指向的是否某个类的实例时,可用iskindof()成员函数时行检查如: pview-iskindof(runtime_class(c*view); 即可检查pview所指是否是c*view类。有了以上基础,我们已经可以从文档类取得任何类的指针。为了方便,我们将其作为一个文档类的成员函数,它有一个参数,表示要获得哪个类的指针。实现如下: cview* c*doc:getvieww(cruntimeclass* pclass) cview* pview; position pos=getfirstviewposition(); while(pos!=null) pview

11、=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是pvie

12、w的下一个视图类的position,完全有可能既是pos=null又是pview符合需要。当所需的视图是最后一个视图是最后一个视图类时就如引。因此需采用两次判断。使用该函数应遵循如下格式(以取得ctestview指针为例):ctestview* ptestview=(ctestview*)getview(runtime_class(ctestview);runtime_class是一个宏,可以简单地理解它的作用:将类的名字转化为cruntimeclass为指针。至于强制类型转换也是为了安全特性考虑的,因为从同一个基类之间的指针类型是互相兼容的。这种强制类型转换也许并不必要,但能避免一些可能出现的麻烦

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!