14.2 MFC的绘图机制
MFC将Windows界面封装到屏幕和打印机中,所以在对图形输出编程(www.cppentry.com)时不必担心很多有关的细节。如第13章所述,Application Wizard生成的程序已经包含了一个派生于MFC类CView的类,它专门设计用于在屏幕上显示文档数据。
14.2.1 应用程序中的视图类
MFC Application Wizard生成的类CSketcherView将在文档窗口的工作区中显示文档的信息。类定义包括几个虚函数的重写,不过在此处着重介绍的一个函数是OnDraw()。每当需要重新绘制文档窗口的工作区时,都将调用这个函数。当程序接收到WM_PAINT消息时,应用程序框架调用的正是这个函数。
OnDraw()成员函数
由MFC Application Wizard创建的OnDraw()成员函数的实现如下所示:
- void CSketcherView::OnDraw(CDC* /*pDC*/)
- {
- CSketcherDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- if(!pDoc)
- return;
- // TODO: add draw code for native data here
- }
一个指向CDC类对象的指针被传递到视图类的OnDraw()成员函数。这个对象包含的成员函数将调用Windows API函数,这些函数允许在设备上下文中绘图。参数名以注释的形式存在,所以在使用这个指针之前,必须解除这个名称的注释,或者用自己的名称代替这个名称。
因为将使用所有这些代码在OnDraw()成员函数中绘制文档,所以Application Wizard已经包括了指针pDoc的声明,并且使用函数GetDocument()对这个指针进行了初始化,函数GetDocument()将返回与当前视图有关的文档对象的地址:
- CSketcherDoc* pDoc = GetDocument();
函数GetDocument()定义在CSketcherView类中,它将从m_pDocument检索指向文档的指针,m_pDocument是视图对象的继承的数据成员。这个函数将执行重要的任务,就是把存储在这个数据成员中的指针强制转换成对应于应用程序中文档类CSketcherDoc的类型。这样,编译器就可以使用此指针访问已经定义的文档类的成员;否则,编译器只能够使用此指针访问基类的成员。因此,pDoc将指向应用程序中与当前视图相关联的文档对象,下面要使用这个指针访问存储在文档中的数据。
下面这一行代码:
- ASSERT_VALID(pDoc);
这个宏确保指针pDoc包含有效的地址,后面的if语句确保pDoc不是空的。在应用程序的发布版本中,忽略ASSERT_VALID。
在OnDraw()函数中,参数pDC的名称代表"指向设备上下文的指针"。将参数pDC所指向的CDC类的对象是在窗口中绘图的关键。CDC类为视图的工作区提供设备上下文,并且提供将图形和文本写入它时需要的工具,所以需要详细地讨论它。