InvalidateRect以及各种刷新函数的认识

本文详细解析了Windows绘图API中的InvalidateRect、UpdateWindow及RedrawWindow三个函数的使用方法与区别。介绍如何通过这些函数实现窗口的局部刷新与背景擦除,适用于需要精细控制界面重绘的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BOOL InvalidateRect (HWND hWnd, CONST RECT* lpRect, BOOL bErase)

此函数的功能是增加一个矩形到窗体的更新区域。这个更新区域就是客户区会被重绘的部分。

参数也很简单。

hWnd  窗口句柄

lpRect 无效区域,即要更新的区域,如果为NULL,即代表要更新整个客户去

bErase 是否擦除背景

如果函数执行成功,返回非零值。如果执行失败,返回0

InvalidateRect函数不会立即更新窗口,它只是将lpRect合并到了更新区域中。系统将会发送WM_PAINT消息,当更新区域不为空并且消息队列中没有其他的消息的时候。

如果bErase参数为TRUE的话,那么所有的更新区域背景都会被擦除,并不是只有lpRect区域背景会被擦除。

如果你在WM_MOUSEMOVE中调用此函数的话,将会明显的看到延迟。怎样解决这个问题呢。windows提供了另外一个api,UpdateWindow

BOOL UpdateWindow(HWND hWnd)

UpdateWindow函数通过发送一个WM_SEND消息来更新客户区的更新区域(只要这个更新区域不为空).。这个函数直接发送一个WM_PAINT消息到这个特定的窗口。没有通过应用程序消息队列。假如这个更新区域为空,那么将没有消息被发出

通过InvalidateRect和UpdateWindw 可以实现即时刷新

还有一个函数,可以实现上面两个函数的功能。

BOOL RedrawWindow(HWND hWnd, RECT* lprcUpdate, HRGN hrgnUpdate, UINT flags)

函数的功能是更新客户区的一个区域,具体函数参数就这里就不介绍了。


上面介绍了函数参数,下面说下怎么用。

InvalidateRect中有个无效区域的参数。可以通过GetUpdateRect得到无效的区域。再只重绘此区域即可。

最近在做duilib,其中都是无窗口模式的。即,基本所有控件都是无句柄的。那么这就涉及到局部重绘。每个控件都有个区域,重绘时,只需重绘此区域即可。




1.duilib简介 duilib是一个开源的DirectUI界面库,简洁但是功能强大。而且还是BSD的license,所以即便是在商业上,大家也可以安心使用。 现在大家可以从这个网站获取到他们所有的源码:/p/duilib/ 为了让我们能更简单的了解其机制,我们按照如下顺序一步一步的来对他进行观察: 工具库:用于支撑整个项目的基础 控件库:这是dui最关键的部分之一,相信也是大家最关注的部分之一,另外这里也来看看它是如何管理这些控件的 消息流转:有了控件库,我们需要将Windows窗口的原生消息流转给这些控件,另外在这里也来看看Focus,Capture等等的实现 资源组织和皮肤加载:有了上面所有的这些,我们再来看看它是如何自动创建皮肤的 简单使用:最后,来看看到底要如何使用它 以下是duilib工程带的一副总体设计图,在看代码之前看看这幅图,对看代码会很有帮助。 duilib: 2.工具库 由于duilib没有对外部的任何库进行依赖,所以在其内部实现了很多用于支撑项目的基础类,这些类分布在Util文件夹中: UI相关:CPoint/CSize/CDuiRect 简单容器:CStdPtrArray/CStdValArray/CStdString/CStdStringPtrMap 上面这些类看名字就基本能够理解其具体的含义了,当然除了基本的基础库,还有一些和窗口使用相关的工具的封装: 窗口工具:WindowImplBase,这个工具我们在这里不详述,后面会再次提到。 3.控件库 控件库在duilib的实现中被分为了两块:Core和Control: Core中包含的是所有控件公用的部分,里面主要是一些基类和绘制的封装。 Control中包含的就是各个不同的控件的行为了。 Core部分和控件相关的类图非常简单: duilib-core: 3.1.控件基类:CControlUI CControlUI在整个控件体系中非常重要,它是所有控件的基类,也是组成控件树的基本元素,控件树中所有的节点都是一个CControlUI。 他基本包括了所有控件公共的属性,如:位置,大小,颜色,是否有焦点,是否被启用,等等等等。当然这个类中还提供了非常多的基础函数,用于重载来实现子控件,如获取控件名称和ClassName,是否显示,等等等等。 另外为了方便从XML中直接解析出控件的各个属性,这个类中还在提供了一个SetAttribute的方法,传入字符串的属性名称和值对特定的属性进行设置,内部其实就是挨个比较字符串去完成的,所以平时使用的时候就还是不要使用的...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值