文档章节

避免VC绘图闪烁

来来叔叔
 来来叔叔
发布于 2017/08/04 23:56
字数 441
阅读 7
收藏 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
CScrollView滚动视图中的图形绘制技巧

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

阳_
2013/09/17
0
0
WinformGDI+入门级实例——扫雷游戏(附源码)

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

穆翔
2016/09/27
1K
4

没有更多内容

加载失败,请刷新页面

加载更多

js 写文件

//写文件function doSave(value, type, name) {    var blob;    if (typeof window.Blob == "function") {        blob = new Blob([value], {type: type});    }......

重城重楼
12分钟前
1
0
Ubuntu and Apache 搭建 Let's Encrypt SSL Https

本文参考来着来自https://www.howtoing.com/install-free-lets-encrypt-ssl-certificate-for-apache-on-debian-and-ubuntu 感谢作者的分享 本事例环境介绍 ubuntu (Version 16.04.1 LTS) ubu......

罗培海
15分钟前
8
0
如何优雅的使用RabbitMQ

目录 RabbitMQ无疑是目前最流行的消息队列之一,对各种语言环境的支持也很丰富,作为一个.NET developer有必要学习和了解这一工具。消息队列的使用场景大概有3种: 1、系统集成,分布式系统的...

编程SHA
18分钟前
1
0
阿里开发者们的第19个感悟:Simple is better.

1月16日,Simple is better.这是我们送给开发者的第19个感悟。 Mars,基于矩阵的统一计算框架。已经开源。那么:Mars 是什么,能做什么,怎么做的;Mars 如何分布式地执行等。可以与继盛多交...

阿里云官方博客
19分钟前
2
0
StringBuffer 和 StringBuilder 的 3 个区别

StringBuffer 和 StringBuilder 它们都是可变的字符串,不过它们之间的区别是 Java 初中级面试出现几率十分高的一道题。这么简单的一道题,栈长在最近的面试过程中,却经常遇到很多求职者说反...

Java技术栈
23分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部