
CAboutDlg 关于对话框类 基类 对话框类CDialog类
CHelloApp 应用程序类 基类 Windows应用程序类 CWinApp
CHelloDoc 文档处理类 基类 文档类 CDocument
CHelloView 文档视图类 基类{普通视图类 CView,窗体视图类 CFormView,编辑视图类CEditView}
CMainFrame主要框架类 基类 框架类CFrame
看你的程序倒数第十行左右有这么两句:
cxtm_pCurrentDoc=new CMyDoc();//文档类地址给current了,文档对象
pFrame->LoadFrame(IDR_MENU1,WS_OVERLAPPEDWINDOW,NULL,&cxt);
cxt参数中包含了CMyDoc类型的指针,而LoadFrame将这个变量最终传给了CView类中的CDocument m_pDocument变量,而CView类的GetDocument()函数就是获取这个变量的值。所以就是一个CMyDoc指针转化成CDocument指针最后你又转化回原来的CMyDoc指针。并不存在所谓基类指针强制转派生类的情况,因为本身就指向一个派生类实例。
LoadFrame大致流程
LoadFrame->Create->CreateEx->CreateWindowEx->OnCreate->OnCreateHelper->OnCreateClient->CreateView
一般来说,是不能在“任意地方”获得的。
在CDoc、CView、CMainFrame这三个类是有提供函数可以获得的,具体可以查一下。GetMainFrame、GetDocument之类的。可以在任意地方获得的只有一个:AfxGetApp()。只有APP是全局共享的。
其他地方,比如自己自定义的类,或者自定义的对话框,都要通过参数去传递。比如自定义对话框可以在构造函数的参数中传递文档类的指针之类的。
整复杂了,可以直接在CMainFrame中增加函数处理状态栏中的 *** 作,何必用复杂的获取指针,这样只用CMainFrame pFrame = (CMainFrame)AfxGetMainWnd();,就可以调用状态栏的 *** 作函数了
提供一个建议 :
使用一个全局的 指针 保存 CMainFrame 的指针,然后再CMainFrame 类内增加一个 public的函数,在Document中借助这个指针来调用CMainFrame中的public函数,来实现切换
//全局变量指针
CMainFrame m_pFrmApp;
//在CMainFrame的构造函数中
theAppm_pFrmApp = this;
然后再Document中通过theAppm_pFrm指针调用CMainFrame 的public成员函数
前人在CSDN总结的,曾经帮助过我,整理总结一下,希望也能帮助一下别人。
获得CWinApp
获得CMainFrame
获得CChildFrame
获得CDocument
获得CView
在CWinApp中
AfxGetMainWnd()
m_pMainWnd
AfxGetMainWnd()->MDIGetActive()
AfxGetMainWnd()->GetActiveFrame()
SDI:AfxGetMainWnd()->GetActiveView()->GetDocument()
MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()->GetDocument()
SDI:AfxGetMainWnd()->GetActiveView()
MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()
在CMainFrame中 AfxGetApp()
theApp
MDIGetActive()
GetActiveFrame()
SDI:GetActiveView()->GetDocument()
MDI:MDIGetActive()->GetActiveView()->GetDocument() SDI:GetActiveView()
MDI:MDIGetActive()->GetActiveView()
在CChildFrame中 AfxGetApp()
theApp
GetParentFrame()
GetActiveView()->GetDocument() GetActiveView()
在CDocument中 AfxGetApp()
theApp
AfxGetMainWnd() AfxGetMainWnd()->MDIGetActive()
AfxGetMainWnd()->GetActiveFrame()
POSITION pos = GetFirstViewPosition();GetNextView(pos)
在CView中 AfxGetApp()
theApp
AfxGetMainWnd() GetParentFrame() GetDocument()
在其他类中 AfxGetApp()
AfxGetMainWnd() AfxGetMainWnd()->MDIGetActive()
AfxGetMainWnd()->GetActiveFrame()
SDI:AfxGetMainWnd()->GetActiveView()->GetDocument()
MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()->GetDocument()
SDI:AfxGetMainWnd()->GetActiveView()
MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()
理一理MFC的这几个类的关系,可以很容易明白上面的这些乱七八糟的逻辑。
App是应用域,所有的域中的东西都可以通过全局函数访问到它。
MainFrame是主框架,也基本可以用全局函数访问到。
MainFrame下是若干个ChildFrame,ChildFrame中若干个View和Document(可能不成对),ChildFrame管理着View,View和Document进行互 *** 作。
因此整体框架就出来了,一般除了直接应用的关系都可以通过MainFrame-->Active ChildFrame-->Active View-->Document这条线进行访问,这应该叫什么来自?万能方法吧^_^。
恕我懒惰,不愿意画一个更详细的图解,凑合着看看吧。
CMainFrame 可从 CWnd 取得。
任何窗口类都来源于CWnd 而 CDialog 来源于CWnd 所以 可以直接调用 CWnd 的函数:
CMainFrame pM=(CMainFrame)AfxGetMainWnd();
至于 EnableMenuItem 函数参数,你要查一下。
这里,我只给你解决你的难点--- pM 的获取问题。
以上就是关于CAboutDlg, CHelloApp, CHelloDoc, CHellpView, CMainFrame分别是什么意思或作用全部的内容,包括:CAboutDlg, CHelloApp, CHelloDoc, CHellpView, CMainFrame分别是什么意思或作用、MFC中一些getdocumet函数的指针强转,如下。、VC 单文档多视图中如何在项目的任意地方获得这个文档等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)