7.1设备描述表与CDC类
MFC的CDC类对设备描述符表和GDI函数进行了全面的封装,使这两者的使用更加方便。
7.1.1设备描述表与GDI对象
1.设备描述符表也称为设备上下文,它是Windows应用程序与设备驱动程序和输出设备之间的接口。
Windows中的设备描述符表分为以下4种类型:
显示器型:支持显示器上的绘图操作。
打印机型:支持打印机和绘图仪上的绘图操作。
内存型:支持位图上的绘制操作。
信息型:支持设备数据的访问。
2.GDI对象
GDI是图形设备接口的缩写。GDI对象是绘图工具比如画刷画笔。
7.1.2CDC类
由于DC与屏幕绘图及文本显示操作密切相关,CDC类封装了相当多的函数,主要包括以下几类:
初始化函数:指定的设备创建设备描述符。
设备描述符表函数:如保存或恢复DC的状态。
绘图及其相关函数:如设置绘图前背景颜色,绘图工具选择,图形绘制等。
文本与字体函数:如文本输出字体信息的取得。
坐标与映射函数:比如设置映射方式,各种坐标的转换等。
7.1.3设备描述符表的申请和释放
在处理不同的消息时,应使用不同的ARI函数来申请不同类型的设备描述符表(同时其释放函数也不同)
1. 处理WM_PAINT消息
在处理WM_PAINT消息时,使用BeginPaint()API函数来取得设备描述符表的句柄和用EndPiant()API函数来释放设备描述符表。BeginPaint()的返回值中包含了窗口客户区无效范围的矩形,后续绘图函数只能在这一区域内绘图,并且BeginPaint()调用使这一区域有效。
一个提高程序效率的方法是在不需要时禁止WM_PAINT消息的发送。例如,滚动用户域时,用户域将成为无效域。Windows系统把WM_PAINT消息放入应用程序队列以更技术应在应用程序的非WM_PAINT代码部分使用,因为BeginPaint()会使无效域有效。
如果想迫使Windows系统发送一条WM_PAINT消息,InvalidateRect()和InvalidateRgn()用于一部分或全部用户域无效。单独使用这些函数都使应用程序队列中增加一条WM_PAINT消息。如果想马上得到一条WM_PAINT消息,可在上述函数后面加上一个UpdateWindows()函数。UpdateWindows()函数把WM_PAINT消息直接发给应用程序而不经过消息队列。
2. 处理非WM_PAINT消息
在处理非WM_PAINT消息时,应使用如下API函数取得或释放设备描述符表。
(1) 用GetDC()取得设备描述符表,并用ReleaseDC()释放设备描述符表。这种方式取得的设备描述符表为窗口客户区的设备描述符表。程序只能在窗口客户区内绘图。
(2) 用GetWindowDC()取得设备描述符表。并用ReleaseDC()释放设备描述符表。这种方式取得的设备描述符表为整个窗口的设备描述符表,包括客户区、标题栏、菜单、滚动条和框架。程序可在整个窗口内绘图。
(3) 用CreateDC()取得设备描述符表,并用DeleteDC()释放设备描述符表。这种方式可获得某个指定设备的设备描述符表,比如获得整个屏幕的设备描述符表,这样应用程序就可以在自己的窗口之外进行绘图。
7.1.4WM_PAINT消息的响应过程
AppWizard生成的框架程序中对WM_PAINT消息的响应函数为CView类的OnPaint()。OnPaint()函数的定义如下:
Void CView::OnPaint()
{
//standard paint routine
CPaintDC dc (this);
OnPrepareDC(&dc);
OnDraw(&dc);
}
OnDraw()是虚函数,将调用在应用程序视图类中改写了的OnDraw(),AppWizard生成的这一OnDraw()代码如下:
Void CKeyView::OnDraw(CDC* pDC)
{
CKeyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
}
7.2基本图形绘制
CDC类封装了大量的绘图函数
7.2.1画点
SerPixel()函数用于画点,它有两个重载版本,这两个函数原形为:
COLORREF SetPixel(int x , int y, COLORREF crColor);
COLORREF SerPixel(POINT point, COLORREF crColor);
参数x为点的横坐标,参数y为点的纵坐标,这两个参数也可以放在一个PONIT类型的变量中,POINT类型为VisualC++中定义的点结构,如下所示
Typedef struct tagPOINT
{
LONG x;
LONG y;
}POINT;
参数crColor指定点的颜色。可以用RGB()宏指明颜色,此宏指令返回一个COLORREF值,这是Windows指明颜色的方式。RGB宏有3个参数,依次为红、绿、蓝的分量值,每个参数的取值范围为0~255.
SetPixel()函数的返回值是实际所画点的颜色,若操作失败,则返回1.