文档章节

避免VC绘图闪烁

来来叔叔
 来来叔叔
发布于 2017/08/04 23:56
字数 441
阅读 4
收藏 0
点赞 0
评论 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
广州
高级程序员
解决CListCtrl闪烁及水平滚动条不能跟踪拖动的问题(MFC)

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

zwgdft
2012/03/26
0
0
ClientToScreen ()与 ScreenToClient()

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

zhangyujsj
2014/12/02
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
CScrollView滚动视图中的图形绘制技巧

当文档的尺寸大于视图的范围时候可以采取CScrollView这种带滚动条的视图类解决文档的显示,还可以通过整体和局部的缩放交互技术实现。 在默认的情况下,窗口更新图面的时候,程序内部会用背景...

阳_
2013/09/17
0
0
WinCE 4.2(.net精简框架集)下的图形双缓存处理

在上位机Windows操作平台( .net 2.0框架集)下实现图形双缓存有很多办法,每种办法在上位机都有很好的效果,但是很不幸,在WinCE4.2操作系统(.net 2.0精简框架集)下这些方法要么不支持,要...

刘洪峰iot
2006/11/21
0
0
Android提高第三篇之SurfaceView与多线程的混搭

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! 上一篇简单介绍了SurfaceView的基本使用,这次就介绍SurfaceView与多线程的混搭。SurfaceView与多线程混搭,是为了防止动画闪烁...

晨曦之光
2012/03/14
2K
1
AfxExtractSubString 函数的相关问题

AfxExtractSubString函数的用法 注:本文系rainy8758原创,转载请注明出处:http://blog.hjenglish.com/rainy8758/articles/1010963.html 注:本文系rainy8758原创,转载请注明出 处:http:...

xumaojun
03/17
0
0
gdip+mfc,改变窗口大小时闪烁,怎么办?

使用gdip在custom控件上绘图,开启了双缓冲,但拖动改变控件大小时闪烁的很厉害,推测是改变控件大小时自动刷新背景导致的,重载OnEraseBkgnd()函数后,好点,但还是闪,有平滑一点的解决方法吗?...

ZeronoFreya
2016/08/16
25
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

如何把你的Linux系统变的更加安全

做为一个小白,以为自己懂了点Linux知识,会搭建Linux各种服务就觉得自己牛的不要要的。在我们团队里面,我将使用了一台破电脑搭建Linux服务器,上面跑着Ftp服务存放着资源,ssh服务可以远程...

问题终结者
1分钟前
0
0
lombok的使用和原理

一、项目背景 在写Java程序的时候经常会遇到如下情形: 新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法 lombok项目的产生就是为了省去我们手...

颖辉小居
1分钟前
0
0
rsync至服务同步-系统日志-screen

rsync: 服务同步;配置文件:/etc/rsyncd.conf 默认端口:873 服务启动:rsync --daemon rsync -av /root/1.txt 192.168.1.2::test/2.txt (test为模块名称) /etc/rsync.conf配置样例: #指定...

ZHENG-JY
3分钟前
0
0
读取文件中内容转换成字符串

package com.lieni.ruyu.api.xmlTool; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.Unsuppo......

newdeng
4分钟前
0
0
《PHP和MySQL Web 开发》 第8章 设计Web数据库

LCL WARNING 这是我学习《PHP和MySQL Web 开发》的读书笔记,一些重要的知识点我会记录下来,当然只会写我觉得重要的。 如果有幸有人看到这个学习笔记了,你要结合着书看,不要光看这个笔记。...

十万猛虎下画山
11分钟前
0
0
Spring+jpaNo transactional EntityManager available

TransactionRequiredException: No transactional EntityManager availableEntityManager执行以下方法(refresh, persist, flush, joinTransaction, remove, merge) 都需要需要事务i......

wpfc
11分钟前
0
0
八幅漫画理解使用JSON Web Token设计单点登录系统

八幅漫画理解使用JSON Web Token设计单点登录系统 Sep 07, 2015 in Engineering 上次在《JSON Web Token - 在Web应用间安全地传递信息》中我提到了JSON Web Token可以用来设计单点登录系统。...

祖冲之
13分钟前
0
0
Spring框架中的设计模式(三)

Spring框架中的设计模式(三) 原创: 瑞查德-Jack 在之前的两篇文章中,我们看到了一些在Spring框架中实现的设计模式。这一次我们会发现这个流行框架使用的3种新模式。 本文将从描述两个创意...

瑞查德-Jack
16分钟前
1
0
[MicroPython]TPYBoard智能小车“飞奔的TPYBoard装甲一号”

智能小车作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。智能小车能够实时显示时间、速度、里程,具...

bodasisiter
18分钟前
0
0
桌面虚拟化VDI(Virtual Desktop Infrastructure)

为了保证员工(客户)不把公司的资料复制、传输给别人。可以把员工平时办公放在服务器上做。所以使用桌面虚拟化。就是把一个服务器虚拟出很多桌面系统(如:windows)。 桌面虚拟化最大的优势...

王坤charlie
26分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部