Windows图形设备接口GDI(Graphic Device Interface)提供了在Windows先绘图的基本功能。所有的绘制操作都是通过DC(设备描述表)进行的。设备描述表(device context),是对各种不同设备的抽象,应用程序只要向DC输出,由DC负责处理不同设备的差异。
1、GDI绘图的实现
图形设备接口(GDI)和设备驱动程序实现了设备无关性的图形的显示,而设备描述表则是用来确定GDI输出的位置和形象的属性。
GDI可以看做是一个用用程序与输出设备之间的中介,一方面GDI向引用程序提供一个设备无关的编程环境,另一方面,它又以设备相关的格式和具体的设备打交道。
应用程序运行时,必须通知GDI装入一定设备的驱动驱动程序,而后准备各种输出操作。这是通过创建和维护一个设备描述表来实现的。
设备描述表是一种Windows数据结构,它包括了与一个设备的绘制属性相关的信息。所有的绘制操作通过一个设备上下文对象进行,该对象封装了实现绘制线条、形状和文本的Windows API函数。
2、MFC图形对象类
Windows提供了多种用于在设备描述表中进行绘制的图形对象、如画笔、位图、调色板、取悦和路径等。MFC对这些图形对象进行了封装,提供了等同于他们的图形对象类。
l 画笔对象,Cpen类,在画点和画线时有用。属性包括颜色、宽度和线的风格。
l 画刷,Cbrush类,画刷对象决定填充区域时所采用的颜色或模板。
l 字体,Cfont类,用于输出文字时选用不同等个和大小的字体。
l 位图,Cbitmap类,该对象可以包含一幅图像,保存在资源中
l 调色板,Cpalette类,一种颜色映射接口。
l 区域,CRng类,区域对象可以限制作图区域或改变窗口外形。
3、图形对象的操作步骤
1) 定义一个图形对象,并用对应的Create××()方法初始化对象。例如,若要创建CPen对象,使用CreatePen()方法。
2) 一般使用CDC::SelectObject()方法,选定新对象,该方法返回一个指针,指向被替换掉的原绘画对象,该返回对象要进行保存。
3) 完成绘画后,再次使用CDC::SelectObject()方法,将上一步保存的原来的绘画对象恢复,使所有一切恢复原样。
注意:声明为指针并用new操作符进行分配的图形对象必须被显示删除[delete()方法]
4、设备描述类CDC类
在MFC中,CDC类封装了设备描述表(DC),该类的核心是m_hDC,代表一个纸箱窗口DC的句柄。几个常用的CDC类的派生类:CpaintDC、CclientDC和CwindowDC。
CDC类派生自Cobject类,它既包括了设备属性又包括了绘图方法,通过此方法乐意实现GDI的所有图形输出。
l CclientDC,代表客户窗口区的设备环境,绘图点(0,0),位于客户区的左上角。可在任何需要的时候随意创建一个CclientDc对象,其析构函数将自动调用ReleaseDC()自动释放设备描述表。
l CwindowDC,代表整个窗口区(包括客户区和非客户区)设备环境,绘图点(0,0)在整个窗口的左上角。其也是可在任意地方创建,自动释放设备描述表。
l CpaintDC,代表客户区的无效区域(需要重画的区域),如被对话框遮挡的部分,用于WM_PAINT消息的处理程序OnPaint()中,实现诸如窗口重绘之类重画图形的工作。
5、代码演示CclientDC和CWindowDC的使用
1)创建工程
创建一个基于单文档的MFC应用程序
2)编辑菜单
添加“图形绘制”下拉菜单项,其下包含两个菜单项“CclientDC”和“CwindowDC”。分别在视图类和主框架类中添加COMMAND消息响应函数OnClientdc()和OnWindowsdc()
3)添加代码,完善功能
代码如下:
void CSDIDemoView::OnClient()
{
// TODO: Add your command handler code here
CClientDC dc(this); //创建CClientDC类对象
CPen pen1; //自定义画笔对象
pen1.CreatePen(PS_SOLID,0,RGB(255,0,0)); //创建对象
CPen *poldPen=dc.SelectObject(&pen1);
//选择新画笔,返回并保存原值
dc.SelectStockObject(GRAY_BRUSH); //选择库存灰色画刷
CRect rect1(0,0,120,90); //定义矩形
dc.Rectangle(&rect1); //画出矩形
}
void CMainFrame::OnWindowsdc()
{
// TODO: Add your command handler code here
CWindowDC dc(this); //创建CWindowDC类对象
CPen pen1; //自定义画笔
pen1.CreatePen(PS_SOLID,0,RGB(255,0,0));
//调用CreatPen函数设置画笔属性
CPen *poldPen=dc.SelectObject(&pen1);
//将原画笔绑定到dc,并赋给一个画笔指针
dc.SelectStockObject(GRAY_BRUSH); //选择库存灰色画刷
CRect rect1(0,0,120,90); //创建矩形对象,并初始化
dc.Rectangle(&rect1); //画出矩形
}