MFC把早期的窗口类的功能分成三个部分:数据存储、管理部分,数据显示与用户交互部分,管理窗口框的大小、标题、菜单条、状态条的窗框部分。
从而形成了三个类:CDocument、视图类CView和窗口框架类CFrameWnd。
上面的三个对象之间的关系类似于房屋的窗户,窗口框架类CFrameWnd相当于窗框,视图类CView相当于窗框上的玻璃,而文档类CDocument就相当于室内的物品。在房屋的外面,透过玻璃可以窥见室内的部分物品,作为房屋,它可以有多个窗户从不同的角度来查看房屋中的同一物品。
有两种类型的文档/视图结构程序:单文档界面(SDI)应用程序和多文档界面(MDI)应用程序。当用MFC AppWizard生成应用程序框架时,MFC AppWizard会自动以文档类CDocument为基类。如下:
class CMyDoc:public CDocument { private: int Array[3]; protected: CMyDoc(); DECLARE_DYNCREATE(CMyDoc) public: void SetMem(int i,int x); int GetMem(int i); public: virtual BOOL OnNewDocument(); virtual void Serialize(CArchive &ar); virtual ~CMyDoc(); DECLARE_MESSAGE_MAP() }; CMyDoc::CMyDoc() { for(int i = 0; i < 3; i ++) Array[i] = 0; } void CMyDoc::SetMem(int i,int x) { Array[i] = x; } int CMyDoc::GetMem(int i) { return Array[i]; }
CView对象没有自己的边框,它的作用是为框架窗口提供用户区。
用MFC AppWizard生成应用程序时,会根据项目名字生成一个视图类,如项目名是MyPrj,则向导会生成一个CMyPrjView的类。
class CMyView:public CView { protected: CMyView(); DECLARE_DYNCREATE(CMyView) public: CMyDoc *GetDocument(); virtual void OnDraw(CDC *pDC); virtual BOOL PreCreateWindow(CREATESTRUCT &cs); public: virtual ~CMyView(); protected: DECLARE_MESSAGE_MAP() };
其中最重要的是GetDocument和OnDraw。
class CMainFrame:public CFrameWnd { protected: CMainFrame(); DECLARE_DYNCREATE(CMainFrame) public: virtual ~CMyView(); protected: DECLARE_MESSAGE_MAP() };