MFC文档/视图结构关联基类学习

来源:互联网 发布:access2007数据库教程 编辑:程序博客网 时间:2024/05/21 19:48

MFC编程常用到文档/视图结构,它可以将程序的数据层和界面层分开,主要包含五个基本类:CWinApp,CDocTemplate,CFrameWnd,CDoc,CView

1、 CWinApp类:管理整个应用程序

  • 部分成员变量:
 CDocManager* m_pDocManager;// 文档/视图管理器指针 LPCSTR m_pszAppName;// 应用程序名称    HINSTANCE m_hInstance;// 实例的句柄    m_pMainWnd; // 为框架窗口指针  
  • 部分成员函数
 InitInstance(); // 初始化    void AddDocTemplate(CDocTemplate* pDoc);// 将pDoc加入模板链表 POSITION GetFirstDocTemplatePosition() const;// 获得第一个文档模板的 POSITION类型的位置 CDocTemplate* GetNextDocTemplate(POSITION& pos) const;// 获得pos位置的文档模板,并将下一个模板的POSITOON位置传给pos;   GetActiveDocument(); // 得到当前活动文档指针  GetActiveView(); // 得到当前活动视图指针    SetActiveView(); // 设置当前视图为活动视图 

2、 CDocTemplate类

//常用派生类CSingleDocTemplate类和CMultiDocTemplate类void CloseAllDocuments(BOOL);CDocument* OpenDocmentFile(LPCSTR, BOOL)

3、 CFrameWnd类:主窗口框架,管理文档和视图,

void ActivateFrame(int);// 

4、 CDoc类:保存管理数据

 // 对文档的操作    BOOL OnNewDocument(); BOOL OnOpenDocument(LPCSTR lpszPathName); BOOL OnSaveDocument(LPCSTR lpszPathName); void OnCloseDocument(); // 对文档关联的视图操作   POSITION GetFirstViewPosition() const;// 文档对象链表中的第一个文档位置    CView* GetNextView(POSITION&) const;// 得到下一个视图 GetDocTemplate();// 得到文档模板指针    void AddView(CView*); void RemoveView(CView*); void UpdateAllView(CView*);

5、CView类:显示编辑数据。

CDocument* GetDocument() const;// 得到对应的文档指针 CFrameWnd* GetParentFrame() const;// 得到框架指针
  • 创建文档/视图框架结构程序时,MFC自动在初始化时创建其他几个类
BOOL   CMyApp::InitInstance()    {    CSingleDocTemplate*   pDocTemplate; // CSingleDocTemplate模板类  pDocTemplate   =   new   CSingleDocTemplate(     IDR_MAINFRAME,     RUNTIME_CLASS(CMyDoc),   // CDoc类  RUNTIME_CLASS(CMainFrame),  //  CFrameWnd类  RUNTIME_CLASS(CMyView));  //  CView类  AddDocTemplate(pDocTemplate);  //存入m_templateList链表  } 

6、[转] 框架、文档、视图类之间的调用关系

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)
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;
}

7、消息

通常我们的操作都是通过视图窗口完成,消息由视图进行接收并且进行处理。所以消息映射定义一般在视图中。但如果一个应用同时拥有多个视图而当前活动视图没有对消息进行处理则消息会发往框架窗口。另外框架窗口可以方便的处理非窗口消息,故菜单消息相应函数顺序是:CView>>CDoc>>CMainFrame>>CApp。