上一篇我们谈到了一个MFC程序的生死因果过程,本片简要分析MFC程序骨干内容。
精通MFC程序设计的第一要务是熟记各类的层次结构,并清楚的了解其中几个常用的类,这对于MFC程序开发者来说将大有裨益,至于MFC的程序结构,本处不再给出,可参见MSDN的Hierarchy Chart。
支撑应用程序的Document/View
CDocument:
在MFC中,可以把Document简单想做是“数据”,也就是说,MFC的CDocument简单地说就是负责处理数据的类。CDucument可以内嵌其他对象,比如链表、数组等等。
CView:
CDocument的另一价值在于它搭配了另一个重要的类:CView。可以这样认为,不论什么类型,数据总是有体有面,实际的数据数值就是体,显示在屏幕上的画面就是面,“数值的处理”应该使用字节、整数、浮点数、链表、数组等数据结构,而“数值的表现”应该使用绘图工具,如坐标系统、笔刷颜色、点线圆弧、字形等。CView就是为了数据的表现而设计的。处理负责显示,View还负责程序与使用者之间的交谈接口,使用者对数据的编辑、修改都需要仰赖窗口上的鼠标与键盘操作才得以完成,这些消息都将由View接收后再通知Document。
Document/View:
Document/View的价值在于,这些MFC类已经把一个应用程序所需的“数据处理与显示”的函数空壳都设计好了,这些函数都是虚函数,所以你也可以在派生类中改写他们。有关文件读写的操作在CDocument的Serialize函数中进行,有关画面的显示操作在CView的OnDraw或OnPaint函数中进行。当我们为自己派生出两个类CMyDoc和CMyView时,我只要把全副心思花在CMyDoc:Serialize和CMyView::OnDraw身上,其他事整个程序会自己做好,这里所说的自己做好包括:
- 如果按下【File/Open】,Application FrameWork 会激活对话框,让你指定文件名,然后自动调用CMyDoc::Serialize读文件。Application FrameWork还会调用CMyView::OnDraw,把数据显示出来。
- 如果屏幕改变,产生了WM_PAINT,FrameWork会自动调用你的CMyView::OnDraw,传一个Display DC,让你重新绘制窗口内容。
- 如果按下【File/print...】,Framework会自动调用你的CMyView::OnDraw,这次传进去的是个Print DC,因此绘图操作的输出对象就成了打印机。
- 一份Document对象
- 一份View对象
- 一份CMDIChildWnd对象(作为外框窗口)