MFC文档类CDocument

来源:互联网 发布:艾儿长靴淘宝店铺 编辑:程序博客网 时间:2024/04/30 18:55

概述

一个最基本的文档视图框架程序组成部分:View(显示数据);Document(管理数据)父类是CCmdTarget,提供文档数据的管理;Frame(作为容器)提供各种业务支持。

文档的使用创建过程:

1.调用Frame的LoadFrame()函数,创建Frame窗口

2.在Frame的WM_CREATE消息中,创建View对象以及窗口

3.在View的WM_CREATE消息中,将Document的地址保存到View中,将View的地址保存到Document中

关系:CWinApp->m_pMainWnd(CFrameWnd)->m_pViewActive(CView)->m_pDocument(CDocument)->m_viewList(CView的List)

命令消息:1.添加消息映射 2.处理顺序CFrameWnd::OnCmdMsg  View->Document->Frame->App

实例

// MFCDoc.cpp : 定义应用程序的类行为。 #include "stdafx.h" #include "Resource.h" class CMyData:public CCmdTarget{DECLARE_MESSAGE_MAP()protected: afx_msg void OnTest();};BEGIN_MESSAGE_MAP(CMyData,CCmdTarget)ON_COMMAND(ID_TEST,OnTest)END_MESSAGE_MAP() void CMyData::OnTest() { AfxMessageBox(L"CMyData::OnTest"); } class CMyDoc:public CDocument { public: CMyDoc(); virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);  CString mStrData; CMyData mMyData; DECLARE_MESSAGE_MAP() protected: afx_msg void OnTest(); };BEGIN_MESSAGE_MAP(CMyDoc,CDocument)ON_COMMAND(ID_TEST,OnTest)END_MESSAGE_MAP()CMyDoc::CMyDoc(){mStrData="Hello CDocment";}BOOL CMyDoc::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo){if (mMyData.OnCmdMsg(nID,nCode,pExtra,pHandlerInfo)){return TRUE;}return CDocument::OnCmdMsg(nID,nCode,pExtra,pHandlerInfo);}void CMyDoc::OnTest(){AfxMessageBox(L"CMyDoc::OnTest");}class CDocView:public CEditView{DECLARE_DYNCREATE(CDocView)DECLARE_MESSAGE_MAP()public:virtual void OnInitialUpdate();protected: afx_msg void OnTest();};BEGIN_MESSAGE_MAP(CDocView,CEditView)ON_COMMAND(ID_TEST,OnTest)END_MESSAGE_MAP()IMPLEMENT_DYNCREATE(CDocView,CEditView)void CDocView::OnInitialUpdate(){//获取文档CMyDoc* pDoc=(CMyDoc*)GetDocument();SetWindowText(pDoc->mStrData);}void CDocView::OnTest(){AfxMessageBox(L"CDocView::OnTest");}class CMainFrame:public CFrameWnd{DECLARE_MESSAGE_MAP()public: afx_msg void OnTest();};BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)ON_COMMAND(ID_TEST,OnTest)END_MESSAGE_MAP()void CMainFrame::OnTest(){AfxMessageBox(L"CMainFrame::OnTest");}class MFCDocApp:public CWinApp{public:virtual BOOL InitInstance();};BOOL MFCDocApp::InitInstance(){CMainFrame* pFrame=new CMainFrame;CCreateContext cxt;cxt.m_pNewViewClass=RUNTIME_CLASS(CDocView);cxt.m_pCurrentDoc=new CMyDoc;pFrame->LoadFrame(IDR_MAINFRAME,WS_OVERLAPPEDWINDOW,NULL,&cxt);pFrame->InitialUpdateFrame(NULL,TRUE); m_pMainWnd=pFrame;m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();return TRUE;}MFCDocApp theApp;

运行结果:

单文档视图程序

单文档视图程序:同时只能管理一个文档;CWinApp/CFrameWnd/CView/CDocument;CSingleDocTemplate-单文档;

#include "stdafx.h"#include "Resource.h"class CSdiDoc:public CDocument{DECLARE_DYNCREATE(CSdiDoc)};IMPLEMENT_DYNCREATE(CSdiDoc,CDocument)class CSdiView:public CEditView{DECLARE_DYNCREATE(CSdiView)};IMPLEMENT_DYNCREATE(CSdiView,CEditView)class CMainFrame:public CFrameWnd{DECLARE_DYNCREATE(CMainFrame)};IMPLEMENT_DYNCREATE(CMainFrame,CFrameWnd)class CSdiApp:public CWinApp{public:virtual BOOL InitInstance();};BOOL CSdiApp::InitInstance(){//创建文档模板CSingleDocTemplate * pTemplate=new CSingleDocTemplate(IDR_MAINFRM,RUNTIME_CLASS(CSdiDoc),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CSdiView));    //将模板添加到应用程序中AddDocTemplate(pTemplate);//创建新文档OnFileNew();//显示并更新主框架窗口m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();return TRUE;}CSdiApp theApp;

关闭时:

原创粉丝点击