`
lingyibin
  • 浏览: 191009 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

MFC学习笔记(八)

阅读更多

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。

前者是视图类对象获取文档数据的重要手段,视图类对象通过它来访问文档类对象的数据。
后者是一个视图处理函数,它的作用是用来更新视图的显示。

程序的数据部分交由文档类对象负责,与用户交互的消息处理和显示交由视图类对象负责,那么最后的那个CFrameWnd类所负责的事件就不多了。
它的主要代码如下:
class CMainFrame:public CFrameWnd
{
	protected:
		CMainFrame();
		DECLARE_DYNCREATE(CMainFrame)
	public:
		virtual ~CMyView();
	protected:
		DECLARE_MESSAGE_MAP()
};
 当然CFrameWnd也从CWnd中得到了很多方法,具体的可以自己去google。

最后,为了把视图对象、框架窗口对象和文档对象组织在一起并统一管理,MFC使用了一个叫做文档模板的抽象类CDocTemplate。它有两个派生类:单文档模板类CSingleDocTemplate和多文档模板类CMultiDocTemplate。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics