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指定的矩形来处理重绘,减少执行不必要的代码,从而提高效率。

原创粉丝点击