【局部刷新】GetUpdateRect和GetClipBox 获取无效区域的区别
来源:互联网 发布:软件行业发展现状 编辑:程序博客网 时间:2024/05/17 09:20
原文地址::http://blog.sina.com.cn/s/blog_4c0cb1c001018e23.html
相关网帖
1.请问 MFC中 GetUpdateRect()怎么获得无效矩形?----http://topic.csdn.net/u/20081211/22/0eac573c-f0e4-46fd-ab2f-4e07c058262c.html?seed=3194964&r=60494669#r_60494669
个人在实际使用中的体会(基于WINCE),不具有权威性。
1、GetUpdateRect是获得需要刷新的无效区域,在调用了InvalidRect后可以用这个函数来获得无效区域,但是如果在之前调用了BeginPaint/EndPaint则取到的无效区域为空,这也是为什么要在WM_PAINT中调用BeginPaint的原因。在需要做局部刷新的时候这个函数很有用。
2、GetClipBox是获得裁剪区域大小,在很多时候最终效果是和GetUpdateRect相同的。但是有两点不太相同的
1)在InvalidateRect触发WM_PAINT后直接调用GetClipBox取得的可显示区域是和GetUpdateRect取得的无效区域是一样的
2)看GetClipBox的返回值(NULLREGION、SIMPLEREGION、COMPLEXREGION、RGN_ERROR)可以得知,第一种和第二种情况和GetUpdateRect相同(无效区域无或有),而第三种情况在需要进行复杂不规则图形局部刷新时很有用也更有效率,举个简单的例子:在屏幕左上角和右下角各有一个矩形,在InvalidRect后如果不调用UpdateWindow,则系统会取两个矩形的最大化区域(也就是全屏幕)并触发WM_PAINT,此时GetUpdateRect获得的无效区域也就是全屏无效区域,应用程序是不知道实际刷新区域的;GetClipBox尽管也是返回的全屏区域,但是在创建裁剪区(CreateRectRgnIndirect)并选入(SelectClipRgn)后,应用程序尽管也不知道实际刷新区域但最终的效果只会刷新两个角的矩形。关于这一点是在实际开发中得知的,这种情况下SelectClipRgn返回值是COMPLEXREGION,我猜测有可能在CreateRectRgnIndirect的时候系统内部查询了一下实际无效区域再创建并组合剪裁区(这个猜测不知道是不是对的),或者SelectClipRgn取得是CreateRectRgnIndirect区域和InvalidateRect区域的交集
补充:根据BitBlt在贴图的时候如果是有效区域则跳过来看,应该是GDI的优化机制,这个与region关系不大。所以提倡在WM_PAINT中用BeginPaint来画图的深层次目的就是为了利用GDI的优化机制进行无效区域管理及局部绘图提高效率,而用GetDC主动画图获得的是全屏无效区域,想局部刷新就必须用户自已来管理无效区域或使用裁剪区域功能。GetUpdateRect和GetUpdateRgn获得的数据应该是系统记录的,在BeginPaint后就被reset了
- 【局部刷新】GetUpdateRect和GetClipBox 获取无效区域的区别
- 使用GetUpdateRect和GetClipBox的体会
- 使用GetUpdateRect和GetClipBox的体会
- 使用GetUpdateRect和GetClipBox的体会
- WINCE UI显示优化经验:使用GetUpdateRect和GetClipBox的体会
- gdi+ 局部刷新(区域的失效)
- 区分无效刷新区域的两种方式——ClipRectangle和随机颜色
- DirectFB学习--局部区域刷新
- 用JScrollPane局部刷新当前可视区域的table
- Asp.net 使用 AXAJ局部刷新无效的解决方法
- 全局变量和局部变量的存储区域
- 有效区域和无效区域
- 无效区域 更新区域 重画 WM_PAINT 的关系和机制
- GetClipBox()和SeletClipRgn()问题
- Listview和Gridview的局部刷新
- UITableView和UICollectionView的局部刷新
- jquery load()局部刷新在ie和firefox下的区别
- GetClipBox
- Unix信号说明
- IPD流程概述
- 回归自然
- shadow map 聊天记录截取
- LTE-4G网络普及
- 【局部刷新】GetUpdateRect和GetClipBox 获取无效区域的区别
- Hibernate 3.x中load方法和get方法的区别
- 致命错误 RC1015: 无法打开包含文件 'afxres.h'
- WM_PAINT介绍 及OnPaint()函数的作用原理
- 减小flex文件(swf)的方法
- 屏幕不光只看尺寸 各材质屏幕实战解析
- wcf 注册windows服务
- javascript面向对象编程封装
- HDU 1015 dfs回溯