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