1. what is DC?
Windows中的设备描述表,实际上就是对显示设备的一种抽象,而显示设备其实就是将内中的像素颜色数据渲染出来,所以设备描述表本质上就是一块内存,我们可以使用GDI函数来在该内存区域内进行绘制,所谓的绘制实际就是在该内存区域中添加像素的颜色信息,同时,Windows提供的GDI函数中,使用Pen来绘制线段,使用Brush来填充该DC,使用Font来写文字,所以如果我们要使用GDI函数在DC中,就必须首先设置这些参数,这些参数被称为DC的属性,显然如果这样使用GDI函数来进行绘图将非常繁琐,所以Windows将这些DC属性也抽象到设备描述表(DC)这个概念中,所以我们可知所谓设备描述表就是一块内存区域和Pen,Brush,ClipRegion,MapMode等等DC属性的一个实例。所以不同的设备描述表就是DC的这些个属性不同。
2. DC的属性
3. 获得DC的函数
3.1 BeginPaint
使用BeginPaint函数获得的DC是窗口的客户区的DC,所以GDI系统会帮我们设置好那些默认的参数,例如窗口的裁剪区域,使用的字体等等,我们就可以直接使用GDI绘图函数在该DC中进行绘制。
3.2 CreateDC
CreateDC函数通过指定设备名称,来创建一个与该设备相关的DC,通过该函数创建的DC必然与一个设备相关,例如打印机,显示器等,所以我们使用CreateDC函数来获得DC在其上的任何GDI操作都将反馈到与该DC相关的设备中,也就是GDI的绘制结果就会被显示出来。所以,如果我们要想获得类似于打印机,绘图仪这样的显示设备的DC,我们就必须使用该函数。
3.3 CreateCompatibleDC
CreateCompatibleDC函数的原型如下:
该函数的作用是创建一个和参数hdc,兼容的DC,前面我们说过,所谓DC就是一块内存区域和那些DC属性的集合,所以这里的创建的兼容DC就是创建一个和 hdc 标示的DC属性完全相同的DC,但是其所指向的内存,却没有和任何实际的显示设备相关联,所以这个函数所创建的DC,就是指向一块普通的内存区域,而不是像BeginPaint函数获得的DC指向显卡的内存。所以由这个函数创建的DC,我们称为内存DC。由于在和设备兼容的内存DC中进行绘制,只是访问内存,而不会有大量的实际设备的调用,所以这可以减少,对设备驱动的调用。所以如果,我们要在某一个设备上进行复杂的图像绘制,最好首先创建一个和该设备兼容的DC,在该兼容DC(也即内存DC)中绘制,绘制完毕之后,再使用函数BitBlt(copy)将该兼容DC中的内容直接一次性拷贝到实际的DC中,这样将大大提高,图像的绘制效率。
3.4 GetDC / GetDCEx
这两个函数提供一种直接获取窗口DC的方式,同时提供了一些更加精细的控制。
4 参考文章
下面的文章,提供了窗口绘制,DC的一些信息。
http://www.codeproject.com/Articles/89996/Drawing-in-Windows-101