解决屏幕上图片闪烁的问题 复制DC的问题

本文对最近在使用双缓冲画图遇到的问题进行一个总结。(复制别人的写的挺好)

双缓冲是画图中使用频繁的手法,用于防止绘图闪烁的问题。

使用框架:

CDC m_memDC;

//初始化兼容的内存DC
    m_memDC.CreateCompatibleDC(pDC);
    CBitmap m_bmpWave;

//创建设备兼容的位图缓冲
    if(!m_bmpWave.CreateCompatibleBitmap(pDC,m_bmpwidth,m_bmpheight))
    {
        ErrorMessageBox(IDS_CREATEBITMAPERROR);
        return false;
    }
    //将位图选到内存DC中用于绘图
    m_pOldBmp = m_memDC.SelectObject(&m_bmpWave);

//此处使用内存DC进行各种绘图操作

.......

pDC->BitBlt(0,0,width,height,&m_memDC,0,0,SRCCOPY);     //将内存图像拷贝到当前设备DC中完成绘图的显示

//后继处理

框架就这样,说说我遇到的问题。

1. 内存位图无法显示在设备DC中。

当然,我的代码比较多。所以这种情况很难调试,只能是估计可能存在的问题。通过调试和分析,找出了问题的所在。由于一些原因,我用到了两个内存DC,我首先将Bitmap通过SelectObject选入到第一个内存DC中进行绘图,然后再第二个内存DC中将同一个Bitmap选入并进行变形操作,然后将第二个内存DC通过BitBlt拷贝到当前设备DC中。刚开始时,位图没有拷贝成功,问题在于第二个DC在选入Bitmap时,第一个内存DC并没有将Bitmap选出,所以问题应该是Bitmap不能同时选入两个不同的DC进行操作。问题找到了,解决方法也就有了,要么在第二个DC选入之前,第一个DC先选出。要么只使用一个内存DC。

关于这个问题后来在MSDN中也看到了相关的说明如下:

An application can select a bitmap into memory device contexts only and into only one memory device context at a time.

证明我的想法是正确的。看来文档还是要多看看,很多问题其实在文档中都有说明。

2. 内存位图拷贝后,显示出来的是黑白的。

这个就是位图的创建方式的问题了,CreateCompatibleBitmap(pDC,m_bmpwidth,m_bmpheight),这个创建位图的第一个参数表示设备DC,位图将会使用和设备DC兼容的颜色和格式。如果传入的是内存DC的指针,那么该位图就使用内存DC的颜色板。而内存DC默认为黑白模式的。因此使用内存DC创建的位图自然也是黑白的。

MSDN的解释:

When a memory device context is created, GDI automatically selects a monochrome stock bitmap for it.

If pDC is a memory device context, the bitmap returned has the same format as the currently selected bitmap in that device context.

好了,解决方案就是使用当前设备DC创建位图而不是内存DC。

时间: 2024-11-14 23:02:45

解决屏幕上图片闪烁的问题 复制DC的问题的相关文章

android自定义控件(8)-利用onMeasure测量使图片拉伸永不变形,解决屏幕适配问题

使用ImageView会遇到的问题 在Android应用中,都少不了图片的显示,ImageView,轮播图,ViewPager等等,很多都是来显示图片的,很多时候,我们都希望图片能够在宽度上填充父窗体,这样比较符合人的审美观点,但是问题就随之而来了,那就是高度如何定义??先来看一个普通的ImageView的 Xml布局文件的定义: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xm

Android自定义控件系列八:详解onMeasure()(二)--利用onMeasure测量来实现图片拉伸永不变形,解决屏幕适配问题

上一篇文章详细讲解了一下onMeasure/measure方法在Android自定义控件时的原理和作用,参看博文:Android自定义控件系列七:详解onMeasure()方法中如何测量一个控件尺寸(一),今天就来真正实践一下,让这两个方法大显神威来帮我们搞定图片的屏幕适配问题. 请尊重原创劳动成果,转载请注明出处:http://blog.csdn.net/cyp331203/article/details/45038329,非允许请勿用于商业或盈利用途,违者必究. 使用ImageView会遇到

电脑屏幕抖动及闪烁问题故障解决

电脑屏幕出现闪烁或者抖动会让你感觉眼睛很快就疲劳,严重影响视力,所以建议遇到电脑屏幕闪烁或者电脑屏幕抖动需要及时去解决电脑故障.你可以学习相关如何优化电脑教程. 产生电脑屏幕闪烁或者电脑屏幕抖动怎么办呢?一般新电脑显示器很少出现电脑屏幕闪烁或者抖动,如果新显示器出现以上故障我们首先排除以下几种可能: 一.显示刷新率设置是否正确 检查方法是:在我们电脑桌面空白区域右键---属性--设置--高级---监视器 如下图: 从中可以看到显示器的刷新频率设置为"60"   ,这正是造成显示器屏幕不

Qt做发布版,解决声音和图片、中文字体乱码问题(需要在main里写上QApplication::addLibraryPath(&quot;./plugins&quot;)才能加载图片,有图片,很清楚)

前些天做Qt发布版,发现居然不显示图片,后来才发现原来还有图片的库没加!找找吧,去qt的安装包,我装在了F盘,在F盘F:/QT/qt/plugins,找到了plugins,这里面有个 imageformats是图片的库,里面有jpg,gif等,你用到那种格式就加那种!加的时候一点过要注意,将imageformats这个文件夹考到你的程序当前文件夹内!并在主函数里加:QApplication::addLibraryPath("./plugins"); 这样你的带图片的发布版就做好了! 看

MFC绘制图片闪烁详解

用MFC如何高效地绘图             显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题.     而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案.     MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,     只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的绘图程序.     我想就我长期(呵呵当然也只有2年多)使用MFC绘图的经验谈谈     我的一些观点.     1.显示的图形为什么会闪烁?             我们的

C#图片闪烁

导致画面闪烁的关键原因分析:       一.绘制窗口由于大小位置状态改变进行重绘操作时 绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面重新刷新一次以维持窗口正常显示.刷新过程中会导致所有图元重新绘制,而各个图元的重绘操作并不会导致Paint事件发生,因此窗口的每一次刷新只会调用Paint事件一次.窗口刷新一次的过程中,每一个图元的重绘都会立即显示到窗口,因此整个窗口中,只要是图元所在的位置,都在刷新,而刷新的时间是有差别的,闪烁现象自然会出现. 所以说,此时导

【图片闪烁问题】

出现原因:多张图片显示时,由于部分图片重叠,导致重画时出现闪烁 解决方法:双缓冲技术 实质上是将多张图片全部加载在一个bitmap矩形中,最后用GDI+一次性画出 [图片闪烁问题],布布扣,bubuko.com

如何解决GDI+渲染图片慢的问题?

项目是做一个画图程序,最近加入了一个图片闪烁的效果,用timer定时每100ms画一遍,每遍通过colormatrix设置不同的alpha值实现(colormatrix几乎不会增加负荷,渲染速度仅增加1ms消耗).效果是没问题,但是效率有问题了.当画一个3000*3000的jpeg图片的时候,debug模式下测试平均需要8ms(graphics的所有参数都设置为速度优先),此时还比较流畅.但是当图片缩小后再画出来就达到35ms左右(通过Gdi.ScaleTransform()进行缩放的),效率明

(转)解决WINDOWS 程序界面闪烁问题的一些经验

一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁. 先来谈谈闪烁产生的原因 原因一:如果熟悉显卡原理的话,调用GDI函数向屏幕输出的时候并不是立刻就显示在屏幕上只是写到了显存里,而显卡每隔一段时间把显存的内容输出到屏幕上,这就是刷新周期. 一般显卡的刷新周期是 1/80秒左右,具体数字可以自己设置的. 这样问题就来了,一般画图都是先画背景色,然后再把内容画上去,如果这两次操作不在同一个刷新周期内完成,那么给人的视觉感受就是,先看