MFC--自己优化滚动条的双缓冲绘图方法
MFC--自己优化的双缓冲绘图方法
自己通过尝试,用修改视图坐标的方法, 优化了双缓冲绘图,实现起来并不复杂。
在介绍这个方法前,重新介绍一下窗口和视口的概念.
窗口:就是我们通过拖滚动条所能看到的整个窗口.它是有一部分不能被当前显示的.
视口:就是我们能直接看到的当前显示的窗口,它是窗口的一部分,滚动窗口的视口肯定比窗口小一些,普通窗口的视口大小就是窗口大小.
下面介绍优化方法
网上给出的双缓冲绘图方法多是在内存中绘出一幅和窗口大小相同的位图再导入设备.对于滚动窗口,我前些日子写的日志也给出了方法.这样做,虽然达到了目
的,但是却很大程度上的浪费了内存资源.比如,窗口大小800*600,滚动窗口1600*800.如果只是刷新了1*1的视口区域,将需要在内存中绘
800*600的位图,对于滚动窗口,更是需要1600*800的位图,而只有1*1的区域是有效的.资源浪费了几十万倍.优化的方法就是在内存中只绘一
幅和刷新区域同样大小的位图.
优化步骤:
一.在OnDraw(CDC* pDC)函数中定义相关变量.
刷新区域 CRect rc,
兼容DC CDC memDC,
兼容位图 CBitmap memBmp,
二.调用GetClipBox(&rc)获得刷新区域,注意,获得的区域是以逻辑坐标表示的,不是设备坐标。rc的左上角坐标即兼容DC视口坐标相对逻辑坐标的偏移,将这个坐标设为兼容DC的视口坐标原点,这样不做其它调整就可以按照逻辑坐标在兼容DC里绘图了。这样绘图时将逻辑坐标加上偏移量就是兼容DC的设备坐标.调用CreateCompatibleDC()创建兼容DC,调用
CreateCompatibleBitmap()创建兼容位图,调用SelectObject()导入位图.
三.绘图.先调用FillSolidRect()用指定的颜色刷背景,再判断下要画在图在不在rc范围内,如果不在,不画,画也没有意义,画图.
四.调用BitBlt()导入位图,销毁位图对象,DC.
五.最后,响应 WM_ERASEBKGND 消息,直接返回TRUE,取消刷新背景.
说明:双缓冲绘图本身都具有一定的复杂性,如果所绘的图形并不复杂,使用这种方法不会有明显的效果提升.
很简单吧,给出示例代码,在文档类中保存的矩形对象m_ellipse内画椭圆.
void CTest2View::OnDraw(CDC* pDC)
{
// TODO: add draw code for
native data here
CDC memDC;
CBitmap memBmp;
memDC.CreateCompatibleDC(pDC);//创建兼容DC
CRect rc;
pDC->GetClipBox(&rc);//获得刷新区域
// 创建兼容位图
memBmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
memDC.SelectObject(&memBmp);//导入位图
//红色背景
memDC.FillSolidRect(0,0,rc.Width(),rc.Height(),RGB(255,0,0));
memDC.SetWindowOrg(rc.left, rc.top);
//start画图 这是画一个椭圆的示例代码
CRect ellipse = GetDocument()->m_ellipse;
if( !( (rc.left >
ellipse.right ) //右侧超出
|| (rc.right < ellipse.left
) //左侧超出
|| (rc.top > ellipse.bottom) //下侧超出
|| (rc.bottom< ellipse.top ) )) //上侧超出
{
memDC.Ellipse(&ellipse); //画图
}
//end画图
//导入
pDC->BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), &memDC, rc.left,
rc.top, SRCCOPY);
memBmp.DeleteObject();//销毁位图
memDC.DeleteDC();//销毁DC
}
BOOL CTestView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message
handler code here and/or call
// default
return TRUE;
//
return CView::OnEraseBkgnd(pDC);
}
MFC--自己优化滚动条的双缓冲绘图方法的更多相关文章
- 【MFC】MFC绘制动态曲线,用双缓冲绘图技术防闪烁
摘自:http://zhy1987819.blog.163.com/blog/static/841427882011614103454335/ MFC绘制动态曲线,用双缓冲绘图技术防闪烁 2011 ...
- MFC双缓冲绘图(2015.09.24)
问题引入: 最近在尝试编写贪吃蛇游戏时遇到这么一个问题:当系统以较快频率向窗口发送WM_PAINT消息时,调用OnPaint()函数在窗口中绘制图形就会发生闪烁现象. 问题分析: 当我们把绘图过程放在 ...
- MFC双缓冲绘图实例
本人之前一直了解双缓冲绘图的基本原理,但是在研究很久之后才大概知道具体的使用过程,本文将详细介绍本人在实际项目中使用双缓冲绘图的案例. 实现功能:主界面显示某张包含人脸的图片,通过dlib detec ...
- mfc双缓冲绘图
1.要求 在界面加载本地图片并显示,每过100ms改变一张图片显示 2.现象 通过定时器控制CImage,Load,Draw,Destroy,会非常的卡顿.因为Load图片时,会是非常大的数据[所有C ...
- 陈灯WGF双缓冲绘图框架
“木丸子童屋”,专售各类儿童玩具,价格优惠,请大家多多支持:http://shop65552598.taobao.com/ WGF(windows graphic foundation)为window ...
- [Qt2D绘图]-06QPainter的复合模式&&双缓冲绘图&&绘图中的其他问题
本篇读书笔记主要记录QPainter的复合模式&&双缓冲绘图&&绘图中的其他问题 大纲: 复合模式 双缓冲绘图 绘图中的其他问题 ...
- C#-gdi绘图,双缓冲绘图,Paint事件的触发
一. 画面闪烁问题与双缓冲技术 1.1 导致画面闪烁的关键原因分析: 1 绘制窗口由于大小位置状态改变进行重绘操作时 绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面 ...
- 双缓冲绘图和窗口控件的绘制——ATL ActiveX 窗口控件生成向导绘制代码OnDraw的一个错误 .
双缓冲绘图和窗口控件的绘制 ---ATL ActiveX 窗口控件生成向导绘制代码OnDraw的一个错误 cheungmine 我们通常使用ATL COM组件,生成一个带窗口的ActiveX控件,然后 ...
- 简单的 "双缓冲" 绘图的例子(研究一下)
所谓双缓冲就是先画到内存画布(如: TBitmap), 然后再转帖到目的地. 譬如下面小程序: procedure TForm1.FormCreate(Sender: TObject); begin ...
随机推荐
- jchdl - RTL实例 - And2(结构体的使用)
https://mp.weixin.qq.com/s/qTgeBF9N0mx5UK3xWDb3jg jchdl对Verilog做了增强,增加了用户自定义结构体类型.使用自定义结构体,可以对输入和输 ...
- 关于MySQL无法启动的一点问题
今天早上做作业启动MySQL遇到服务无法启动的问题,在网上找方法解决找了一个钟. 修改host文件,重装mysql服务,就差卸载重装了.到后面终于找到问题,原来是我之前改了root密码,所以每次启动m ...
- Java实现 蓝桥杯 算法提高 p1001
算法提高 P1001 时间限制:1.0s 内存限制:256.0MB 提交此题 当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法.具体来说 ...
- Java实现 LeetCode 22 括号生成
22. 括号生成 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", &quo ...
- java实现第四届蓝桥杯梅森素数
梅森素数 题目描述 如果一个数字的所有真因子之和等于自身,则称它为"完全数"或"完美数" 例如:6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 ...
- cocos2dx获得字体的宽高
Android: 1.在CCImage中添加下面的方法: //头文件声明略. cocos2d::CCSize CCImage::getStringSize(const char *text, cons ...
- Linux内核配置编译及基本调试方法
一.Linux内核配置编译 1. 交叉编译设置:make ARCH=arm CROSS_COMPILE=arm-linux- 注:也可以直接修改顶层Makefile ARCH ?= arm CROSS ...
- hadoop知识整理(2)之MapReduce
之前写的关于MR的文章的前半部分已丢. 所以下面重点从3个部分来谈MR: 1)Job任务执行过程,以及主要进程-ResourceManager和NodeManager作用: 2)shuffle过程: ...
- Spting:基于注解的组件化管理
@Component,@Controller(控制层),@Service(业务层),@Repository(持久层) 以上四个注解的功能完全相同,不过在实际开发中,要在不同功能的类上加上响应的注解 1 ...
- PAT 1043 Is It a Binary Search Tree (25分) 由前序遍历得到二叉搜索树的后序遍历
题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following proper ...