CwinApp,CView,Cframe之间的关系

来源:互联网 发布:qq mac版怎么更新 编辑:程序博客网 时间:2024/04/29 10:20

访问应用程序的其它类

获得CWinApp:

-在CMainFrame,CChildFrame,CDocument,CView中直接调用AfxGetApp()或用theApp

-在其它类中只能用AfxGetApp()

获得CMainFrame:

-在CMinApp中用AfxGetMainWnd()或者m_pMainWnd

-在CChildFrame中可用GetParentFrame()

-在其它类中用AfxGetMainWnd()

获得CChildFrame:

-在CView中用GetParentFrame()

-在CMainFrame中用MDIGetActive()或GetActiveFrame()

-在其它类中用AfxGetMainWnd()->MDIGetActive()或AfxGetMainWnd()->GetActiveFrame()

获得CDocument:

-在CView中用GetDocument()

-在CChildFrame中用GetActiveView()->GetDocument()

-在CMainFrame中用

-if SDI:GetActiveView()->GetDocument()

-if MDI:MDIGetActive()->GetActiveView()->GetDocument()

-在其它类中

-if SDI:AfxGetMainWnd()->GetActiveView()->GetDocument()

-if MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()->GetDocument()

获得CView:

-在CDocument中 POSITION pos = GetFirstViewPosition();GetNextView(pos)

-在CChildFrame中 GetActiveView()

-在CMainFrame中

-if SDI:GetActiveView()

-if MDI:MDIGetActive()->GetActiveView()

-在其它类中

-if SDI:AfxGetMainWnd()->GetActiveView()

-if MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()

//////////////////////////////////////////////////////////////////

不错!!!

不过要注意在doc中要取得view的指针C*View要注意类C*View声明的问题,

因为默认情况下,mfc在*View.h中已经包含了*Doc.h,如果在*Doc.h中包含

*View.h,就会引起嵌套包含问题,这样要在*Doc.h中加入 class C*View;

而在*Doc.cpp中加入 #include "*View.h"

//////////////////////////////////////////////////////////////////

其实完全可以在CYourApp中添加各种视或文档的指针,在那些视或文档初

始化的时候将指针传给CYourApp中的对应变量,这样以后不管在哪用上面

指针只需(CYourApp*)AfxGetApp()取其属性变量即可,明了而且清楚更是

方便我一直专门操作的说:) 

//////////////////////////////////////////////////////////////////

我先抛块砖,有玉的砸过来!

在何时何地,你都可以通过以下方法精确的得到任何一个对象(Application,DocTemplate,Document,View,Frame)

1。通过AfxGetApp()得到当前的App对象;

2。通过AfxGetMainWnd()得到主窗口;

3。通过CMDIFrameWnd::GetActiveFrame得到当前活动窗口;

4。通过GetNextWindow()遍例所有的子窗口;(如果要得到你想要的子窗口,可以通过特定的成员变量来标志);

5。通过CWinApp::GetFirstDocTemplatePostion()以及CWinApp::GetNextDocTemplate()的组合应用来遍历所有的DocTemplate对象,并且用CDocTemplate::GetDocString()来判断当前得到的文档莫板对象是哪个。

6。通过CDocTemplate::GetFirstDocPosition()以及CDocTemplate的GetNextDoc()组合来遍历所有的该模板的文档对象,并用CDocument::GetDocTemplate()来得到文档模板,用CDocment::GetTitle() 或者GetPathName()来判断当前的文档是哪个。

7。通过CDocuemt的GetFirstViewPositon()以及GetNextView()来遍历视图对象,一般通过访问View的成员变量来区别各个视图;通过CView::GetDocument()来得到文档对象;

8。Frame->View: 通过GetActiveView方法;

9。Frame->Doc:通过GetActiveDocument();

10。View->Frame:GetParentFrame();

11。View->Doc:GetDocuemt()//前面已经说了。

12。Doc->View:前面说了;

13。Doc->Frame:不知道有没有很直接的方法。

4 楼guoxiny(狼)回复于 2003-07-18 09:44:28 得分 0

11)对于单文档中也可以加入多个文档模板,但是一般的开发就使用MDI方式开发

多文档模板,其方法与上述视图的获取方法很接近,这里稍做解释,如果不清楚,

请查阅MSDN,(以下四个内容(11、12、13、14)来源:

http://sanjianxia.myrice.com/vc/vc45.htm

可以用CWinApp::GetFirstDocTemplatePostion获得应用程序注册的第一个文档模板

的位置;利用该值来调用CWinApp::GetNextDocTemplate函数,获得第一个

CDocTemplate对象指针。 POSITION GetFirstDocTemplate( ) const;

CDocTemplate *GetNextDocTemplate( POSITION & pos ) const;

第二个函数返回由pos 标识的文档模板。POSITION是MFC定义的一个用于迭代或对象

指针检索的值。通过这两个函数,应用程序可以遍历整个文档模板列表。如果被检索

的文档模板是模板列表中的最后一个,则pos参数被置为NULL。

12)一个文档模板可以有多个文档,每个文档模板都保留并维护了一个所有对应文

档的指针列表。

用CDocTemplate::GetFirstDocPosition函数获得与文档模板相关的文档集合中第一

个文档的位置,并用POSITION值作为CDocTemplate::GetNextDoc的参数来重复遍历与

模板相关的文档列表。函数原形为:

viaual POSITION GetFirstDocPosition( ) const = 0;

visual CDocument *GetNextDoc(POSITION & rPos) const = 0;

如果列表为空,则rPos被置为NULL.

13)在文档中可以调用CDocument::GetDocTemplate获得指向该文档模板的指针。

函数原形如下: CDocTemplate * GetDocTemplate ( ) const;

如果该文档不属于文档模板管理,则返回值为NULL。

14)一个文档可以有多个视。每一个文档都保留并维护一个所有相关视的列表。

CDocument::AddView将一个视连接到文档上,将该视加入到文档相联系的视的列表

中,并将视的文档指针指向该文档。当有File/New、File/Open、Windows/New或

Window/Split的命令而将一个新创建的视的对象连接到文档上时, MFC会自动调用

该函数,框架通过文档/视的结构将文档和视联系起来。当然,程序员也可以根据自

己的需要调用该函数。

Virtual POSITION GetFirstViewPosition( ) const;

Virtual CView * GetNextView( POSITION &rPosition) cosnt;

应用程序可以调用CDocument::GetFirstViewPosition返回与调用文档相联系的视的

列表中的第一个视的位置,并调用CDocument::GetNextView返回指定位置的视,并将

rPositon的值置为列表中下一个视的POSITION值。如果找到的视为列表中的最后一个

视,则将rPosition置为NULL.   

15)从一个视图类取得另一视图类的指针

这个应用在多视的应用程序中很多见,一般如果自己在主程序或者主框架中做好变

量记号,也可以获得,还有比较通用的就是用文档类作中转,以文档类的视图遍历

定位,取得另一个视图类。这个功能从本文第10项中可以得到。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 吃减肥药便秘了怎么办 金运激光头没光怎么办 电动门锁没电了怎么办 孩子吃了防潮剂怎么办 2k15打开闪退怎么办 辐射4空间满了怎么办 辐射4容积满了怎么办 辐射4装甲没电了怎么办 sim卡pin码忘了怎么办 安卓的se已禁用怎么办 刚拿到驾照没车怎么办 驾驶证过期了6年怎么办 驾驶证过期7个月怎么办 驾驶换证过期了怎么办 和喜欢的人聊天冷场怎么办 老公和小三有了小孩怎么办 战网账号忘记了怎么办 战网邮箱忘了怎么办 捷信分期逾期了怎么办 欠捷信7万还不了怎么办 苹果6s阴阳屏怎么办 碰到碰瓷的人怎么办 如果遇到碰瓷的怎么办 对交通事故责任认定书不服怎么办 违停15天没处理怎么办 衣服反光条掉了怎么办 脸过敏起小疙瘩怎么办 过敏怎么办怎么好得快 眉毛在眉骨下面怎么办 踩到地雷怎么办知乎 在边境踩到地雷怎么办 插在花泥里的花怎么办 瓶插绣球花蔫了怎么办 水养绣球花蔫了怎么办 鲜切绣球花蔫了怎么办 崩坏2仓库满了怎么办 dnf88级没任务了怎么办 0号柴油冻住了怎么办 不小心喝了生水怎么办 不小心吃了蟑螂怎么办 以租代购还不起怎么办