WINCE UI显示优化经验:使用GetUpdateRect和GetClipBox的体会
来源:互联网 发布:平板产品展示软件 编辑:程序博客网 时间:2024/06/07 01:31
个人在实际使用中的体会(基于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了
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了
- WINCE UI显示优化经验:使用GetUpdateRect和GetClipBox的体会
- 使用GetUpdateRect和GetClipBox的体会
- 使用GetUpdateRect和GetClipBox的体会
- 使用GetUpdateRect和GetClipBox的体会
- 【局部刷新】GetUpdateRect和GetClipBox 获取无效区域的区别
- 深度学习的一些经验和体会
- GetClipBox()和SeletClipRgn()问题
- 一些经验和体会
- 一些经验和体会
- UI规范使用体会
- GetClipBox
- SDWebImage的使用和体会
- 关于LineChart使用上的一些体会与经验分享
- wince的开发经验
- 大型软件系统中表结构设计的一点体会和经验
- 【Android UI】ListView的使用和简单优化
- UI 一一 UITableView的使用和性能优化
- SCJA的经验与体会
- Eclipse 下 swt designer安装方法
- servlet学习笔记
- CE6下兼容和非兼容位图的深入分析
- Jinja2 简明使用手册(转载)
- installShield for VC6.0生成一个EXE安装包
- WINCE UI显示优化经验:使用GetUpdateRect和GetClipBox的体会
- Antlr中嵌入代码 Action
- OpenGL Overview
- mysql+drbd+heartbeat实现高可用性
- 让S5pv210 android2.3 系统支持USB鼠标的方法(作者:gooogleman)
- 教程: Mustache.js
- LCS C语言源码
- Android 控件系列: GridView 的简单使用
- arm mmu