在前面写了那么多自绘控件,有必要对这几个接口做下声明解释:
这几个接口都是对执行窗体重绘的消息,那么什么时候才会发生重绘窗口的消息?答案是:当窗体需要更新内容或是重绘外观背景的时候,应用程序通常会发送一条WM_PAINT消息,通知窗体进行重新绘制。
InvalidateRect(m_hWnd, lpRect, bErase):
强制系统进行重绘,但是不一定马上会进行重绘,仅仅是通过Post方式将WM_PAINT消息放入到窗体消息队列,当执行到WM_PAINT消息时候才会执行重绘。重绘区域通过lpRect指定,如果为NULL,则重绘整个客户区。
UpdateWindow(m_hWnd):
绕过消息队列直接向窗体发送WM_PAINT消息并且立即执行,发送之前会通过GetUpdateRect(hWnd, NULL, TRUE)看看是否有需要绘制的客户区域,如果没有,就不发送WM_PAINT消息了。
RedrawWindow(HWND hWnd, LPCRECT lpRectUpdate, CRgn* prgnUpdate, UINT flags):
具有InvalidateRect和UpdateWindow的双特性。声明窗口状态为无效,并立即更新窗口,立即调用WM_PAINT消息。
通常我们会看到这样的组合:
InvalidateRect(m_hWnd, lpRect, bErase);
UpdateWindow(m_hWnd);
目的是让窗体立即刷新无效区域。