InvalidateRect中的“部分区域”理解
来源:互联网 发布:大数据时代的机遇 编辑:程序博客网 时间:2024/06/05 17:23
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指定的矩形来处理重绘,减少执行不必要的代码,从而提高效率。
- InvalidateRect中的“部分区域”理解
- InvalidateRect( LPCRECT lpRect) 以及 RedrawWindow( LPCRECT lpRect) 中的重绘部分区域 是什么含义
- InvalidateRect( LPCRECT lpRect) 以及 RedrawWindow( LPCRECT lpRect) 中的重绘部分区域 是什么含义
- 理解InvalidateRect函数
- invalidateRect
- InvalidateRect
- InvalidateRect
- InvalidateRect()
- InvalidateRect
- InvalidateRect
- InvalidateRect
- InvalidateRect 更新特定区域注意的问题(picture控件)
- 截取一张图片中的部分区域存成新文件
- 截取一张图片中的部分区域存成新文件
- 理解JPA,第二部分:JPA中的关系
- Java中的部分类的理解
- 读深入理解Linux内核 (第9章 进程地址空间, 第二部分 ---- 内存区域)
- InvalidateRect只是增加重绘区域,在下次WM_PAINT的时候才生效
- asp数组随机排序
- 车子防护-自燃
- 给优柔寡断和喜欢胡思乱想的朋友们!
- WIN7 Activation,完美激活Windows 7,开机无字符,无OEM信息
- js Tree(梅花雪)最简单的例子(来字MEIZZ)
- InvalidateRect中的“部分区域”理解
- 如何写综述
- sd 卡驱动在2.6内核的编写.sd/mmc/sdio kernel,sd/mmc/sdio 内核
- glib库简介
- 驱动ALIDEVICE.SYS
- .net 操作page类进行全站title统一
- TreeView CheckBox 部分显示
- 窘~~
- 纯js实现俄罗斯方块[效率待优化]