对于DC的理解
DC(Device Context)在GDI中是一个重要的概念,翻译为设备描述表、设备上下文等,到底什么是DC?用现实中的例子来理解可能更容易些。如果你喜欢画画,你得先准备了画布,画笔,颜料……画画的环境搭建好了,你就可以画画了。这个画画的环境,就是DC。在图形环境下,一切都是画出来的,所以,你要准备好一个DC,才能在屏幕上画画。——写字也是画画。在画画的环境中,有哪些对象呢?
- 画布——GDI对象之一:区域
- 画笔——GDI对象之一:画笔
- 颜料盒——GDI对象之一:调色板
如果要在画笔上写字的话,写什么样的字体呢?方正字体?徐静蕾字体?——字体也是GDI对象之一。有的画笔比较粗,专用来刷大面积背景色的,这是刷子——GDI对象之一:刷子。如果你不想画了,只想把别人画好的画,贴到你的画布上,这也是可以的。——GDI对象之一:位图。所以,这里就有6种GDI对象可以用于DC。
现在开始画画了,你拿起了一只笔。——在Windows环境里,这叫选择了一个画笔对象:使用SelectOBject()函数。当然,如果你没带笔也没关系,Windows为你准备了几只画笔,你可以这样申请系统提供的缺省画笔:
hPen = GetStockObject(WHITE_PEN)
如果你画着画着,觉得手中的笔用着不爽,可以换一只啊,没关系的。——依旧是SelectObject()换笔。
当然,如果你走出了画室,别完了把你的画笔清除掉,要不画室里全是笔啊,刷子啊,太乱了。——DeleteObject()。
以上转自:https://blog.csdn.net/xrzh8989/article/details/45693039
实际上DC是一种Windows的数据结构,它包含GDI需要的所有关于显示界面情况的描述字段,包括相连的物理设备和各种各样的状态信息。它是绘图过程中的承载器,而GDI是绘制过程中的绘制器,在特定区域用画笔按不同的颜色绘制图形,便是GDI所负责的事。在.net环境中使用DC获取对应设备的图像时,应该使用 GetDC()函数,其返回值为IntPtr类型。对于IntPtr类型,如果项目平台是x86版本时,其返回的是IntPtr32类型;如果是x64版本时,其返回值是IntPtr64类型。另外,如果使用该函数完成之后,需要调用ReleaseDC()方法释放,否则会出现运行过程中,项目的GDI对象一直增加,当加到其上限值时,程序可能会崩溃(参考:告诉你GetDC()没有释放造成的后果),所以,GetDC() 和ReleaseDC()一定要配对使用。两者调用方法如下。
[DllImport("user32.dll")]
private static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("User32.dll")]
static extern int ReleaseDC( IntPtr hWnd, IntPtr hDC);
对比GetDC()与GetWindowDC()
GetDC(IntPtr hwnd): 用于获得hWnd参数所指定窗口的Client区域的一个设备环境,其在MSDN中原型为HDC GetDC(HWND hWnd), HDC和HWND都是驱动器句柄(长指针),在C#中只能用IntPtr代替。
GetWindowDC(IntPtr hwnd): 用于获取hWnd参数所指定的整个窗口的一个设备环境,包括标题栏、滚动条和菜单。窗口设备上下文允许在窗口中的任何位置进行绘制,因为设备上下文的原点是窗口的左上角,而不是工作区。
GetWindowDC(IntPtr hwnd)只获得通用设备环境,该设备环境的任何属性改变都不会反映到窗口的私有或者类设备环境中(如果窗口有的话)。