文章类型: VC&C++
关键词: vc,doc,frame,view
内容摘要: DOC,VIEW,FRAME互相调用

DOC,VIEW,FRAME互相调用

2016/8/23 9:09:58    来源:apple    阅读:

document/view模式,是为了在逻辑上,让数据和显示分开。

一般在document里,定义document类的成员变量,来存数据,并用View来显示。在document里,当成员变量的数据改变时,你可以用UpdateAllViews()来通知视图更新。

View里,用GetDocument来获取与之对应document的指针,进而可以访问document的成员变量,从而进行显示Document/View仅仅是MFC为你提供的一种很好的支持而已。

         

       MFC中实现经典的MVC结构,如下图所示:

DOC,VIEW,FRAME互相调用

 

注意:

1DocumentView之间的绑定:View绑定到Document
2Frame作为Controller,由于可以接收到输入消息,比较适合充当控制器。但是,由于视图和文档绑定,所以在切换视图时需要将视图和文档分离开,然后再进行切换。
3View作为Contrller,由于该视图和文档是绑定的,所以,可以通过该视图将其他视图与文档关联起来,其他视图并不直接和文档绑定。因此,可以通过隐藏和显示视图来实现不同视图之间的切换。
4MFCDoc/View结构本质上就是MVC结构,是MVC结构的一种实现,但是对MVC结构进行了简化。

先这么多,以后再补充……

 

Dlg Dialog 的缩写,对话框
App类就是这个SDI作为"程序"的入口有点像cMain函数,它不是从CWND中派生出来的。
View是指编辑区里面的事就是那块白色的中间区域他负责绘制和响应一些消息
Doc就有点像数据库,他保存着编辑数据,用于viewRedraw的时候用,还有保存文件。反正动态的编辑数据都放在Doc里面。他也不是从CWND中派生出来的,没有继承MessageBox函数,可以用AfxMessageBox函数。

1 View中获得Doc指针:

CYouSDIDoc *pDoc=GetDocument();//一个视只能有一个文档。

2) App中获得MainFrame指针:

CMainFrame *pMain =(CMainFrame *)AfxGetMainWnd();

 CWinApp 中的 m_pMainWnd变量就是MainFrame的指针也可以.

3) View中获得MainFrame指针:

CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;

4) 获得View(已建立)指针:

 CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;

 CyouView *pView=(CyouView *)pMain->GetActiveView();

5) 获得当前文档指针:

CDocument *pCurrentDoc =(CFrameWnd *)m_pMainWnd->GetActiveDocument();

6) 获得状态栏与工具栏指针:

CStatusBar *pStatusBar(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);

CToolBar *pToolBar=(CtoolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);

7) 如果框架中加入工具栏和状态栏变量还可以这样 :

(CMainFrame *)GetParent()->m_wndToolBar;

(CMainFrame *)GetParent()->m_wndStatusBar;

8) Mainframe获得菜单指针:

CMenu *pMenu=m_pMainWnd->GetMenu();

9) 在任何类中获得应用程序类:

MFC全局函数AfxGetApp()获得。

 

  获得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()取其属性变量即可,明了而且清楚更是  
  方便我一直专门操作的说:)  
   
  //////////////////////////////////////////////////////////////////  
  我先抛块砖,有玉的砸过来!  
  在何时何地,你都可以通过以下方法精确的得到任何一个对象(ApplicationDocTemplate,DocumentView,Frame  
  1。通过AfxGetApp()得到当前的App对象;  
  2。通过AfxGetMainWnd()得到主窗口;  
  3。通过CMDIFrameWnd::GetActiveFrame得到当前活动窗口;  
  4。通过GetNextWindow()遍例所有的子窗口;(如果要得到你想要的子窗口,可以通过特定的成员变量来标志);  
  5。通过CWinApp::GetFirstDocTemplatePostion()以及CWinApp::GetNextDocTemplate()的组合应用来遍历所有的DocTemplate对象,并且用CDocTemplate::GetDocString()来判断当前得到的文档莫板对象是哪个。  
  6。通过CDocTemplate::GetFirstDocPosition()以及CDocTemplateGetNextDoc()组合来遍历所有的该模板的文档对象,并用CDocument::GetDocTemplate()来得到文档模板,用CDocment::GetTitle()   或者GetPathName()来判断当前的文档是哪个。  
  7。通过CDocuemtGetFirstViewPositon()以及GetNextView()来遍历视图对象,一般通过访问View的成员变量来区别各个视图;通过CView::GetDocument()来得到文档对象;  
  8Frame->View   通过GetActiveView()方法;  
  9Frame->Doc    通过GetActiveDocument();  
  10View->Frame      GetParentFrame();  
  11View->Doc:         GetDocuemt()//前面已经说了。  
  12Doc->View:                     //前面说了;  
  13Doc->Frame:                    //不知道有没有很直接的方法。

↑ 上一篇文章:学习MFC首先要知道的___程序执行顺序 关键词:mfc,null,class,文档,框架,文档,管理 发布日期:2016/8/22 17:30:42
↓ 下一篇文章:《深入浅出MFC》– Document-View深入探讨 关键词:MFC,Document,View,Frame,深入探讨 发布日期:2016/8/23 9:25:05
相关文章:
MFC中的MainFrame Dlg,App,Doc,View的关系 关键词:MFC中的MainFrame,Dlg,App,Doc,View的关系 发布日期:2016-08-23 09:39
《深入浅出MFC》– Document-View深入探讨 关键词:MFC,Document,View,Frame,深入探讨 发布日期:2016-08-23 09:25
如何实现CAPP、CMainFrame、CViEW和CDOC之间相互调用? 关键词:如何实现CAPP、CMainFrame、CViEW和CDOC之间相互调用? 发布日期:2016-10-10 15:13
相关目录:.NETVC&C++软件开发
我要评论
正在加载评论信息......