在上几篇中,我们说到了通过GdipCreateFromHDC函数将HDC(设备上下文句柄)装换成GDI+的Graphics对象,讲到了画笔和画刷的使用,并演示了何利用GDI+Flat来画图片和画文字。
其实,我们使用GdiplusFlat的根本目的并不是为了作图,而是为了做出一个漂亮的界面,这年头,用户喜欢个性的、美观的界面,而不像原来一样,只要功能实用,界面用系统的窗口主题无所谓。这也恰恰证明了计算机的普及,而不是专业人士的专用品了。
那么,我们在自绘界面的时候往往遇到过这样的问题:
1。窗口在自绘时闪烁问题严重。
2。自绘不能一次完成,用户看到的现象是,窗口先画出来背景,然后是标题,然后图片文字出现。这样的程序想必任何人都不愿意用。
解决之道:使用“双缓冲绘图”
何谓“双缓冲绘图”?
首先我们需要明白,我们直接用GdiplusFlat或者其他东西绘图时,是直接绘制到显示设备上的,如左图:
也就是说,我们在图形设备上”一笔笔作图“时,因为每一笔之间有间隔,所以用户就看到自绘不能一次完成
那么闪烁的原因呢?闪烁是因为,每一次绘图,都要先把之前的图形抹去,再绘新图,所以造成了闪烁问题。
双缓冲绘图(如右图所示),是指创建一个和窗口的DC大小一样的”内存DC“,先把需要画的东西一步步画在内存DC里,然后一次性复制到窗口DC上,由于复制是一次性的,因此不需要先抹除原先的的内容,因此就没有闪烁问题了,由于复制是一次性的,用户看起来窗口就好像一次性绘制好了。
至于说内存DC是何时创建,这个就根据需要了,我一般是先创建,不销毁,用的时候用,如果什么时候需要绘图什么时候申请会影响效率
创建内存DC一般采用CreateCompatibleDC函数
此函数的原型:
HDC CreateCompatibleDC(
_In_ HDC hdc
);
参数hdc:现有的 DC 的句柄。如果此句柄为 NULL,则该函数将创建与应用程序的当前屏幕兼容内存 DC。
返回值:成功返回内存DC的句柄,失败返回NULL
创建完之后需要创建设备无关位图对象,用CreateDIBSection函数</