关于位图显示为什么要用兼容DC的思考

    大家都知道最简单的显示位图的步骤: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来绘制。由此可以猜想,那些专业的矢量图形绘制软件(例如CorelDRAWIllustrator等),一定是采用兼容DC来做图形绘制的,因为一个页面可能同时存在很多矢量图形。

         以上仅仅是个人的一点点想法,如果有不当之处,欢迎大家批评指正,在下感激不尽!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值