下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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是pview的下一个视图类的position,完全有可能既是pos=null又是pview符合需要。当所需的视图是最后一个视图是最后一个视图类时就如引。因此需采用两次判断。使用该函数应遵循如下格式(以取得ctestview指针为例):ctestview*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《诚信做人到永远》课件
- 2024-2025学年福建省福州市福清市高二上学期期中考试物理试题(解析版)
- 单位管理制度集合大合集【员工管理】十篇
- 单位管理制度集粹汇编【人员管理篇】十篇
- 单位管理制度汇编大合集【人员管理】十篇
- 单位管理制度合并汇编员工管理篇
- 《网吧消防安全授》课件
- 单位管理制度范文大合集人力资源管理
- 单位管理制度呈现汇编人力资源管理篇十篇
- 60个常考的经济学原理和定律
- 《XL集团破产重整方案设计》
- 智慧金融合同施工承诺书
- 【7道期末】安徽省安庆市区2023-2024学年七年级上学期期末道德与法治试题(含解析)
- 2024年01月22094法理学期末试题答案
- 2024年1月国家开放大学法律事务专科《民法学(1)》期末纸质考试试题及答案
- 烟草执法课件教学课件
- 2024年安全文化建设实施方案
- 康复治疗技术历年真题单选题100道及答案
- 2024年领导干部和公务员法律法规应知应会知识考试题库
- 《建筑工程施工许可管理办法》2021年9月28日修订
- 汉字文化解密学习通超星期末考试答案章节答案2024年
评论
0/150
提交评论