InvalidateRect中的“部分区域”理解
2009-12-28 09:17
459 查看
Sandrer问:经常看到书上、网上的资料说 InvalidateRect 能使窗口中部分区域无效
调用 UpdateWindow() 就能检测程序的无效区域,然后发送 WM_PAINT 消息给窗口
但是一般我做程序的时候,在 WM_PAINT 消息的处理过程中的代码都是画整个窗口客户区的
InvalidateRect 对我的程序来说是不是没用(因为每次处理 WM_PAINT 的时候都是整个客户区重画)?
编程都几年了,自己也经常做一些窗口绘制的工作
但就是不能理解这个 部分区域 该怎么画
难道自己要在 WM_PAINT 中首先获得需要更新的矩形范围,然后只画那一部分上去吗?
还是说在整个客户区需要重画的时候,画好后把客户区的图形保存下来,然后需要部分重画的时候,就在这个被保存的图形中剪接相应的矩形上去呢?但是在 WM_PAINT 中如何判断需要重画的区域是整个客户区的矩形区域呢?
是否使用 GetUpdateRect() 函数来获得,然后与客户区域的矩形相比较?
但是如果像上面说的,是从保存的图象中剪接出来,那么如果我在某些操作中更改了客户区图形,打算只更新这个区域的话,那么不就没用?还得整个客户区重新画然后再保存。
那么究竟这个 部分重画 是怎么实现的?
cnzdgs答:InvalidateRect是将窗口中的一块矩形区域标注为“无效”,系统会不断向窗口发送WM_PAINT消息令其重绘。在响应WM_PAINT消息时,需要调用BeginPaint获取DC来进行重绘。该函数会合并所有“无效”区域,对DC进行裁剪,将整个窗口标注为“有效”,清除WM_PAINT消息。DC经裁剪之后,在进行绘制时,超出DC范围的操作将不被处理,所以即使在响应WM_PAINT消息时绘制的是整个窗口,而实际上绘制的也只是“无效”区域。恰当地使用InvalidateRect进行刷新比刷新整个窗口的效率要高。在WM_PAINT消息时,应尽量根据PAINTSTRUCT结构中rcPaint指定的矩形来处理重绘,减少执行不必要的代码,从而提高效率。
调用 UpdateWindow() 就能检测程序的无效区域,然后发送 WM_PAINT 消息给窗口
但是一般我做程序的时候,在 WM_PAINT 消息的处理过程中的代码都是画整个窗口客户区的
InvalidateRect 对我的程序来说是不是没用(因为每次处理 WM_PAINT 的时候都是整个客户区重画)?
编程都几年了,自己也经常做一些窗口绘制的工作
但就是不能理解这个 部分区域 该怎么画
难道自己要在 WM_PAINT 中首先获得需要更新的矩形范围,然后只画那一部分上去吗?
还是说在整个客户区需要重画的时候,画好后把客户区的图形保存下来,然后需要部分重画的时候,就在这个被保存的图形中剪接相应的矩形上去呢?但是在 WM_PAINT 中如何判断需要重画的区域是整个客户区的矩形区域呢?
是否使用 GetUpdateRect() 函数来获得,然后与客户区域的矩形相比较?
但是如果像上面说的,是从保存的图象中剪接出来,那么如果我在某些操作中更改了客户区图形,打算只更新这个区域的话,那么不就没用?还得整个客户区重新画然后再保存。
那么究竟这个 部分重画 是怎么实现的?
cnzdgs答:InvalidateRect是将窗口中的一块矩形区域标注为“无效”,系统会不断向窗口发送WM_PAINT消息令其重绘。在响应WM_PAINT消息时,需要调用BeginPaint获取DC来进行重绘。该函数会合并所有“无效”区域,对DC进行裁剪,将整个窗口标注为“有效”,清除WM_PAINT消息。DC经裁剪之后,在进行绘制时,超出DC范围的操作将不被处理,所以即使在响应WM_PAINT消息时绘制的是整个窗口,而实际上绘制的也只是“无效”区域。恰当地使用InvalidateRect进行刷新比刷新整个窗口的效率要高。在WM_PAINT消息时,应尽量根据PAINTSTRUCT结构中rcPaint指定的矩形来处理重绘,减少执行不必要的代码,从而提高效率。
相关文章推荐
- InvalidateRect( LPCRECT lpRect) 以及 RedrawWindow( LPCRECT lpRect) 中的重绘部分区域 是什么含义
- InvalidateRect( LPCRECT lpRect) 以及 RedrawWindow( LPCRECT lpRect) 中的重绘部分区域 是什么含义
- 读深入理解Linux内核 (第9章 进程地址空间, 第二部分 ---- 内存区域)
- 深入理解java虚拟机 第2章(一):Java内存区域
- Borg论文翻译 以及部分理解
- 理解图形化执行计划 -- 第2部分:如何创建执行计划
- jvm虚拟机特性之内存区域理解
- 理解以太坊 Serenity - 第二部分: Casper
- 深入理解JVM之一:Java内存区域
- 深入理解SELinux SEAndroid(最后部分)
- LAMP 系统性能调优,第 1 部分: 理解 LAMP 架构
- 深入理解JVM之一:Java内存区域
- 【2013南京区域赛】部分题解 hdu4802—4812
- 【深入理解JAVA虚拟机】之运行时数据区域
- CSS float的初步理解:用两种不同的方式来实现一个三列布局,其中左侧和右侧的部分宽度固定,中间部分宽度随浏览器宽度的变化而自适应变化
- 型企业网络配置系列课程详解(二) --OSPF多区域配置与相关概念的理解
- mfc笔记--摘录关于裁剪窗口区域的设置,WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解
- Ubuntu上用快捷键部分区域截图
- LAMP 系统性能调优,第 1 部分: 理解 LAMP 架构
- GCD 深入理解:第一部分