3.6
文本和图形输出
=
第2章中已经述及,Windows的图形和文本输出是由图形设备接口GDI动态链接库处理的,
GDI保证了应用程序可以使用同样的操作方法与各种不同的外部设备进行交互,称为设备无关性。
Windows 引人设备描述表(device contexts,DC),作为对各种不同设备的抽象,应用程序只要
向DC输出,由DC负责处理不同设备的差异。DC是一个数据结构,描述了GDI进行输出所需
要的信息,包括颜色、填充方式、画笔宽度等。在Windows中,DC允许应用程序使用输出设备,
在应用程序、设备驱动程序与输出设备之间建立联系,并提供绘图信息。应用程序一旦拥有一个
DC,就可以向视图类输出文本和各种图形。
在MFC中,CDC类封装了设备描述表DC,该类的核心是m_hDC,代表一个指向窗口DC的
句柄。CDC是一个很大的类,包括创建和初始化DC的函数、绘制一般图形的GDI函数和绘制
各种复杂图形的GDI函数。
1.CDC类及其派生类
CDC类派生自CObject,它具有CObject类的共同特性,例如,可以动态创建类,进行序列化
等。CDC有4个派生类,如表3.11所示。
表3.11 CDC派生类
CDC 派生类
CClientDC
CPaintDC
CWindowsDC
CMetafileDC
说
明
代表窗口客户区
代表客户区的无效区域(需要重画的区域),如被对话框遮挡的部分
窗口区(包括客户区和非客户区)
面向备忘文件的DC,为重绘图记录一系列绘图命令
2. CDC类的使用
设备描述表最常见的使用是在视图类的OnDraw()函数中,如例3.1,AppWizard在创建应
用程序时为视图类添加了下面的OnDraw()函数。
void CExView :: OnDraw(CDC*pDC)
CMyDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO: add draw code for native data here
1
当视图类对象无效而需要重画窗口或有打印命令时,OnDraw()函数被调用。
如图3.30所示,当整个窗口或窗口的某个部分需要重画时,操作系统向应用程序发送一个
WM_PAINT消息,其消息参数中还包含了有关需要重画的窗口部分的信息。这个消息被送至