在多文档MFC应用程序执行过程中,创建了多于一个的文档类、视图类、子框架类对象和一个主框架类、应用类对象。这些对象之间是通过一定的方式联系在一起的,在应用程序设计中,时常需要通过这些对象之间的关系来实现在文档、视图、框架类对象、应用程序类对象间相互引用和调用。如下: 1,视图类对文档类的使用 视图类对象的作用是在客户区显示文档类对象的内容,两者之间的调用最为常用。在视图类中,通过以下函数得到文档类对象的指针。在视图类CDrawView中可以找到一个函数: public: CDrawDoc* GetDocument(); 在视图类CDrawView的成员函数中,可以通过以下代码调用GetDocument函数得到当前文档类对象指针: CDrawDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); 得到指向当前文档类对象的指针pDoc后,同使用普通C++类的指针一样可以调用文档类的成员变量和成员函数了(只能调用public型的)。 2,在框架类中获得当前的文档和视图类对象指针 在主框架类CMainFrame和子框架类CChildFrame中,都可以利用基类的函数,得到指向当前活动的文档类和视图类对象的指针。下面的代码可以获得指向当前活动的文档类对象和视图类对象的指针: CDrawDoc* pDoc = (CDrawDoc*)GetActiveDocument(); CDrawView* pView = (CDrawView*)GetActiveView(); 3,获得应用程序类对象的指针 在MFC应用程序运行的过程中,自始自终存在一个应用类对象,可以在MFC派生类或非MFC派生类中,通过全局API函数AfxGetApp得到应用类对象指针。如可以在应用程序Draw中的任何地方,通过以下代码获得指向应用程序类对象的指针: CDrawApp* pWinApp = (CDrawApp*)AfxGetApp(); 4,从应用程序对象中获得主框架类对象的指针 通过MFC应用程序的应用类对象,可以获得指向当前系统的主框架类对象的指针,在应用类CWinApp中有一个数据成员m_pMainWnd,这个数据成员保存了指向应用程序主框架类对象的指针: CMainFrame* pFrame = (CMainFrame*)(AfxGetApp->m_pMainWnd); 在视图类、文档类,以及非MFC派生类的成员函数(如全局函数)中,是通过API函数AfxGetApp()获得指向应用类对象的,再调用以上代码,得到指向主框架类对象的指针。 通过API函数AfxGetApp()得到指向应用程序类对象的指针,再通过应用程序类对象得到指向主框架类对象的指针,通过主框架指针又可以获得指向当前活动的文档和视图类对象的指针。这种调用可以保证在各种情况下,获得指向MFC应用程序中各主要框架类对象的指针,通过指针使用各框架类对象的成员(数据或函数)。
======================================================================================================== ========================================================================================================
框架、文档、视图类之间的调用关系 1、主框架(CFrameWnd)中访问视图(CView)
CView* GetActiveView() const; 通常定义的视图为CView的派生类,在调用自定义视图对象的方法时应该这样写:((CMouseKeyView*)GetActiveView())->MyFunc();
2、主框架(CFrameWnd)中访问文档(CDocument)
GetActiveDocument,返回CDocument对象;3、在视图(CView)中访问文档(CDocument)
inline CMouseKeyDoc* CMouseKeyView::GetDocument() {return (CMouseKeyDoc*)m_pDocument;}4、在视图(CView)中访问框架(CFrameWnd)
CFrameWnd* GetParentFrame() const;5、在文档(CDocument)中访问框架(CFrameWnd)
CWnd* AfxGetMainWnd(); CWnd* AfxGetApp()->m_pMainWnd;6、在文档(CDocument)中访问视图(CView)
UpdateAllViews 功能:通知所有的视图文档已被修改的信息 原型: void UpdateAllViews( CView* pSender, // 要更新的视图指针,如果希望更新所有视图,将此参数设为NULL
LPARAM lHint=0L, // 包含更改消息的通知 CObject* pHint=NULL // 保管更改消息的对象 }7、在其他类中访问文档类(CDocument)
CDocument* GetDocument() { CFrameWnd* frm=(CFrameWnd*)::AfxGetMainWnd(); ASSERT(frm); CDocument* pDoc=frm->GetActiveDocument(); ASSERT(pDoc); ASSERT(pDoc->IsKindOf(RUNTIME_CLASS(CMouseKeyDoc))); return (CMouseKeyDoc*)pDoc; }