文档章节

避免VC绘图闪烁

来来叔叔
 来来叔叔
发布于 2017/08/04 23:56
字数 441
阅读 5
收藏 0
 

在vc程序中绘制图像时,经常会遇到背景闪烁的现象(我认为闪烁现象是由背景引起的)。有什么办法可以避免或者减小背景闪烁呢?个人经验总结如下:

(1)弄清楚MFC的消息机制和绘图机制

在OnPaint() 或OnDraw()中调用绘制函数,但是不要调用有关改变图像数据的函数。

对话框程序中绘制客户区最好使用CClientDC绘制。

(2)使用双缓冲绘制

即先在内存中“画好”图像,再从内存拷贝到设备环境中。这样可以加快绘制速度,从而避免绘制当前区域时其它部分的闪烁。

CClientDC dc(this);
CDC memDC;
memDC.CreateCompatibleDC(&dc);//创建内存设备环境
CBitmap* pbmpOld = memDC.SelectObject(&m_bitmap);//将位图图像选区入到内存设备环境

dc.SetStretchBltMode(COLORONCOLOR);
dc.StretchBlt(dx0,dy0,dx,dy,&memDC,sx0,sy0,sx,sy,SRCCOPY);//显示内存设备环境中的位图
memDC.SelectObject(pbmpOld);。。。

(3)使用背景填充技术

绘制好目标图像后,对目标区域以外的区域进行填充背景,从而抵制闪烁现象。

CClientDC dc(this);
CBrush brush;
brush.CreateSolidBrush(RGB(0,0,0));//填充背景的画刷(黑色)

CRect rect,imgRect;
CRgn rgn1, rgn2;

GetClientRect(&rect); //得到客户区
rgn1.CreateRectRgnIndirect(rect);

GetImageRect(imgRect); //该函数得到要绘制的图像区
rgn2.CreateRectRgnIndirect(imgRect);

rgn1.CombineRgn(&rgn1,&rgn2,RGN_XOR);//通过xor运算获取图像以外的区域
rgn2.DeleteObject();


dc.FillRgn(&rgn1, &brush);//填充图像以外的背景区域
brush.DeleteObject();
rgn1.DeleteObject();

(4)只刷新“脏”区域

   当要更新绘制区域时,如果只需要刷新一部分区域,那就只刷新该区域,而没必要刷新整个客户区,

造成不必要的闪烁。通常使用该函数InvalidateRect()。


© 著作权归作者所有

共有 人打赏支持
来来叔叔
粉丝 0
博文 100
码字总数 55732
作品 0
广州
高级程序员
私信 提问
ClientToScreen ()与 ScreenToClient()

ClientToScreen( )是把窗口坐标转换为屏幕坐标 pWnd->GetWindowRect(&rc);是获取整个窗体的大小 pWnd->GetClientRect(&rc1);是获取窗体中客户区的大小 ScreenToClient( )是把屏幕坐标转换为窗...

zhangyujsj
2014/12/02
0
0
解决CListCtrl闪烁及水平滚动条不能跟踪拖动的问题(MFC)

项目中用到一个界面如下图所示,在View上有个CPropertySheet,其上有几个CPropertyPage,每个属性页上有个CListCtrl,供用户查看信息。由于CListCtrl中的信息每隔200ms就要刷新一次,导致这个...

zwgdft
2012/03/26
0
0
android 使用双缓冲辨析及surfaceview使用例程-转载(觉得写的很清楚)

本文转自:http://blog.csdn.net/blogercn/article/details/7404485 感谢作者分享! 双缓冲是图像编程中很重要的概念,在电脑的图像处理中就常常使用双缓冲来加快图像显示速度,消除图像刷新...

LiangX
2013/05/28
0
0
WinformGDI+入门级实例——扫雷游戏(附源码)

整体思路: 扫雷的游戏界面让我从一开始就想到了二维数组,事实上用二维数组来定义游戏数据确实是最符合人类思维的方式。(Square类会在后面解释) 有了这个开头,接下来就是填充二维数组的数据...

穆翔
2016/09/27
1K
4
谈谈canvas动画的闪烁问题

一般来说,在H5开发中,使用canvas往往只是为了展示一些简单的图表或者简单短小的动画,很少考虑到有闪烁的问题。最近,在手机QQ魔法表情的项目中,就遇到了奇葩的闪烁问题。这里说的闪烁,是...

WolfX
2016/03/09
109
0

没有更多内容

加载失败,请刷新页面

加载更多

技术工坊|如何开发一款以太坊钱包(深圳)

【好消息!】HiBlock区块链技术工坊已经成功举办了26期,其中北京1期,西安1期,成都2期,上海22期。经常有社区的小伙伴问定期举办技术工坊的除了上海以外,其他城市有没有?现在区块链技术工...

HiBlock
14分钟前
1
0
Redis 梳理笔记

安装 安装gccyum install gcc-c++下载传输到服务器上解压tar -xzvf *.tar.gzcd redis-3.2.9编译make安装 make PREFIX=/usr/local/redis install将配置文件拷贝出来cp redis...

晨猫
16分钟前
0
0
PyCharm flask 'Debug mode off' 调试模式关闭的解决方法

flask的几种debug模式的方法 # 1.app.run 传参debug=trueapp.run(debug=True) #2 设置app的配置app = Flask(__name__)app.config['DEBUG'] = True #3 配置文件方式# config.py中添加d...

yimingkeji
23分钟前
1
0
聊聊storm TridentWindowManager的pendingTriggers

序 本文主要研究一下storm TridentWindowManager的pendingTriggers TridentBoltExecutor.finishBatch storm-core-1.2.2-sources.jar!/org/apache/storm/trident/topology/TridentBoltExecut......

go4it
29分钟前
1
0
java实现多线程两种基本方式

我们在开发当中经常会使用到多线程,这里我们来写两个小案例通过最基本的两种方式继承Thread类或实现Runnable接口来实现一个多线程。 继承Thread类 我们可以通过继承Thread类,并重写run()方...

王子城
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部