大家都知道最简单的显示位图的步骤:1,创建位图对象 2.创建兼容DC 3.将位图对象选入兼容DC 4.在目的DC中显示位图
最初编写位图显示的小程序时一直比较纳闷为什么非得要创建兼容DC呢?以前在做绘制基本图形的程序时根本不用创建兼容DC,可以直接在OnDraw()函数內绘制就行了。现在终于弄明白了,原因就是使用兼容DC可以有效防止屏幕闪烁。
因为位图是点阵图像,所以对位图的显示都是一个点一个点依次绘制出来的,而MFC中对任何对象的都要经过屏幕刷新的过程,在这个过程中首先是OnPaint()隐含调用了OnEraseBkGnd()用白色填充背景,这是屏幕完全是白色,然后才是绘制对象,也就是说对于任何对象的显示都要进过这2个步骤,如果直接用目的DC显示位图的话,每一个像素点的显示过程中都有一个屏幕全白的过程,于是就造成了“图像——空白——图像——空白”如此往复循环的过程,这给人眼的视觉感受就是屏幕闪烁。
明白了闪烁的原因,那我们就很好理解兼容DC的作用了,这个兼容DC里的内容并不是直接输出到显示屏幕,而是将兼容DC里的位图(当然可以有其它对象)当做一个整体直接Copy到目的DC当中,这样在显示整个兼容DC的内容时相当于屏幕只刷新了一次,因为刷新时间特别短,人眼几乎无法分辨,所以就感觉不到有闪烁。
说到这里我们应该明白的是:是否使用兼容DC的决定因素不在于显示的对象是不是位图,关键因素是一次性直接由目的DC显示对象数量的多少来决定的,由于一般位图的像素点数都很多,所以位图全部采用兼容DC来绘制。由此可以猜想,那些专业的矢量图形绘制软件(例如CorelDRAW、Illustrator等),一定是采用兼容DC来做图形绘制的,因为一个页面可能同时存在很多矢量图形。
以上仅仅是个人的一点点想法,如果有不当之处,欢迎大家批评指正,在下感激不尽!