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

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,其中都是无窗口模式的。即,基本所有控件都是无句柄的。那么这就涉及到局部重绘。每个控件都有个区域,重绘时,只需重绘此区域即可。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值