文档章节

避免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
广州
高级程序员
解决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

没有更多内容

加载失败,请刷新页面

加载更多

docker多容器部署lnmp环境

环境:RHEL7.5 ip:192.168.10.102,主机名:lb02 一、创建web、数据库目录 web网站目录为:/wwwroot,属主属组:www [root@lb02 ~]# mkdir /wwwroot[root@lb02 ~]# useradd -s /sbin/nolo...

人在艹木中
27分钟前
1
0
eclipse运行springboot项目报错‘找不到或无法加载主类’

这是一个很烦躁的问题~,往往困住大家好长时间,然后各种百度。借此,咱将这个问题有可能产生的原因进行一下总结。若有不完善之处欢迎大家在下面留言指出~~ Duang!问题出现 然后开始尝试解决...

Code辉
47分钟前
1
0
springboot oauth2 跨域设置

@Overridepublic void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/security/**") .authentica......

昆虫大侠
49分钟前
1
0
08-利用思维导图梳理JavaSE-泛型

08-利用思维导图梳理JavaSE-泛型 主要内容 1.泛型的基本概念 1.1.定义 1.2.使用前提 1.3.使用泛型的好处 2.泛型的使用 2.1.泛型类定义 2.2.泛型对象定义 2.3.泛型中的构造方法 2.4.泛型方法的...

飞鱼说编程
51分钟前
0
0
Docker 部署 Spring Boot 项目指南

仅想在Docker里运行一个Spring Boot项目,捣鼓了许久。。。 本文主要适用于Windows环境下的Docker 一、运行环境 Windows 10 Maven 3.5 Docker 18.06.1-ce-win73 (19507) 二、创建Spring Boot...

AmosWang
57分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部