1.GDI是gdi32.dll这个库,而GDI+是GDIplus.dll这个库
2.GDI是硬件加速的,而GDI+不是
3.GDI是有状态的,而GDI+是无状态的
4.GDI绘图要使用设备环境和句柄,而GDI+全部交给graphics类管理
5.GDI绘图时可以使用selectobject频繁切换图形对象,而GDI+的图形对象是独立的
6.GDI中存在一个"当前位置"(全局区)目的是提高绘图性能,而GDI+取消了它,以避免绘图时不确定这个当前位置而带来的非预期的错误
7.GDI总是将画笔和画刷绑定在一起,即使不需要填充一个区域,也必须指定一个画刷,而GDI+则可以使用不同的函数分开使用画笔和画刷
8.GDI不支持透明图层,而GDI+支持
GDI(Graphics Device Interface) 图形设备接口
GDI是一个抽象的接口,是一个关于图形显示的函数库.通过这个接口可以实现对图形的颜色,线条的粗细等属性的控制.它是我们的程序与计算机硬件之间的一个桥梁
我们通过调用GDI函数来控制硬件显示的效果,这就是设备无关性,也就是我们不需要知道在显示器显示某个颜色需要调用哪个底层的驱动函数方法
Windows是不允许直接访问显示器硬件的,而必须通过和特定窗口关联的设备环境进行通讯的所以,所有的GDI函数都必须带有设备环境这个参数,否则这些函数就不知道对哪个设备进行绘制工作
DC (Device Context) 又称设备上下文,设备描述表。它是一个关于如何绘制图形的方法的集合,它既可以绘制各种图形,也可以确定在应用窗口中绘制图形的方式,就是绘图模式和映射模式。
我们在绘图之前,必须获取绘图窗口区域的一个设备环境DC,接下来就可以调用GDI函数来进行各种图形绘制
在Win32编程中,设备环境是用HDC来标识.
H是Handle,句柄的意思
在winGDI.h这个头文件中,我们发现大部分的GDI函数的第一个参数都是HDC,这就说明了GDI函数是对DC的操作
比如:
BitBlt
DrawText
SetBackMode
SetTextColor
等等..
通过GetDC函数来获得相应窗口的HDC
GetDC函数适合在窗口现有图形的基础上进行绘制。
hDC=GetDC (hWnd)
其他绘图操作代码...
其他绘图操作代码....
ReleaseDC (hWnd, hDC)
GetDC中传入的参数hWnd是窗口的句柄,它返回和这个窗口相关的DC
如果传入0,则返回桌面DC
千万不要忘记ReleaseDC()否则会导致gdi对象泄漏
如果这段代码调用频繁的话,那么程序会在不长的时间内因为申请不到gdi对象而导致窗口黑屏
通过BeginPaint函数来获得所在窗口的HDC
BeginPaint函数是将所有的内容清除千净,然后在上面绘制
BeginPaint (hWnd, ps)
其他绘图操作代码.....
EndPaint (hWnd, ps)
其中第一个参数是窗口句柄.第二个参数是一个数据结构,(一般只使用前三个)结构如下:
数据类型PAINTSTRUCT
HDC hdc 设备环境句柄
BOOL fErase 是否擦除背景
RECT rcPaint 指定需要绘图的窗口区域
BOOL fRestore 系统预留
BOOL flncUpdate 系统预留
BYTrE rgbReserved[32] 系统预留
除响应WM_ PAINT消 息外,应用程序不应调用BeginPaint.每次调用BeginPaint都必须对EndPaint函数进行相应的调用。
通过CreateCompatibleDC函数来创建与目标DC兼容的内存DC,一般用于解决界面闪烁的问题
hDCMem=CreateCompatibleDC (hDC)
其他绘图操作代码......
BitBlt (hDC, X, y, Cx, cy, hDCMem, 0, 0, #SRCCOPY)
DeleteDC (hDCMem)
绘制这个hDCMem不会显示到屏幕上,只有通过调用拷贝函数把内存DC里面的内容拷贝到窗口DC上以后才会显示到窗口上
RGB是24位的颜色值,高八位为R,中间八位为G,后八位为B.
ARGB :是32位的颜色值。高八位为A,次八位为B,再次八位为G,最后八位为R。
RGB转ARGB算法: (A << 24) (R << 16)| (G<< 8)| B
ARGB转RGB算法: (G << 8) (B << 16)| R
RGB和ARGB最大的区别就是ARGB多了一个Alpha通道,支持透明
在GDI中,用HPEN来表示画笔,画线,画边框(如矩形边框,圆边框,饼边框)都是采用画笔来操作的。
GDI默认的画笔为黑色,宽度为1,样式为实线
在GDI中,用HFONT来表示字体。
所有文本绘制都要基于具体的字体对象来绘制的。
GDI中默认的字体是系统等宽字体。
在GDI中,用HRGN来表示区域
在窗口中,一个区域可以是椭圆形,多边形或矩形。
在GDI中,用HBITMAP来表示位图。
GDI的绘制分为图形绘制(线,矩形,椭圆,饼等),图像绘图(位图)
第一个参数是设备DC
第二个参数是HGDIOBJ, GDI对象
这个函数传入一个新的GDI对象到第一个参数的DC中,并返回原来相同类型的GDI对象
比如我传入-一个画笔进去,之后绘制这个DC都是使用新画笔来绘制,当不需要这个画笔时,记得把原来的画笔选回去
自己创建的对象,不需要时请调用DeleteObject删除
库存GDI对象是window系统预定义的一些对象,也是window自己也在使用的对象,
#WHITE_BRUSH | 0 | 白色画刷 |
#LTGRAY_BRUSH | 1 | 亮灰色画刷 |
#GRAY_BRUSH | 2 | 灰色画刷 |
#DKGRAY_BRUSH | 3 | 暗灰色画刷 |
#BACK_BRUSH | 4 | 黑色画刷 |
#NULL_BRUSH | 5 | 空画刷 |
#WHITE_PEN | 6 | 白色画笔 |
#BACK_PEN | 7 | 黑色画笔 |
#NULL_PEN | 8 | 空画笔 |
#OEM_FIXED_FONT | 10 |
#ANSI_FIXED_FONT | 11 |
#ANSI_VAR_FONT | 12 |
#SYSTEM_FONT | 13 |
#DEVICE_DEFAULT_FONT | 14 |
#DEFAULT_PALETTE | 15 |
#SYSTEM_FIXED_FONT | 16 |
#DEFAULT_GUI_FONT | 17 |
比较常用的是# DEVICE_DEFAULT_FONT, Windows
默认绘制文本字体
GetStock0bject (ID) (ID就是上面的对象对应的数字id,建议使用常量名,这样查阅资料比较好查阅)
Windows不建议使用此方法来获取对话框和窗口使用的当前字体
而是使用带有SPI_GETNONCLIENTMETRICS参数的
SystemParametersInfo函数来获取当前字体
使用库存对象不需要删除
GetObject (HGDIOBJ, size, pv)
第一个参数是要获取的GDI对象
第二个参数是要获取这个对象结构的大小
第三个参数是要获取这个对象的结构
这里的结构对应GDI对象结构
扩展阅读:https://blog.csdn.net/jinvmen/article/details/47082593