Invalidate() 函数和 InvalidateRect() 函数的使用和差异
Invalidate() 函数和 InvalidateRect() 函数都是在 Windows 编程中用于触发重绘窗口的函数,它们的作用是使窗口或窗口的一部分无效,从而导致 Windows 发送 WM_PAINT 消息以重绘窗口。但是,它们之间存在一些关键的区别。
Invalidate() 函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时 Windows 会在应用程序的消息队列中放置 WM_PAINT 消息。MFC 的视图类提供了 WM_PAINT 的消息处理函数 OnPaint,OnPaint 负责重绘窗口。在视图类的 OnPaint 函数中调用了 OnDraw 函数,实际的重绘工作由 OnDraw 来完成。参数 bErase 为 TRUE 时,重绘区域内的背景将被擦除,否则,背景将保持不变。
InvalidateRect() 函数的作用是增加重绘区域,在下次 WM_PAINT 的时候才生效。InvalidateRect 函数中的参数 TRUE 表示系统会在你画之前用背景色将所选区域覆盖一次,默认背景色为白色,可以通过设置 BRUSH 来改变背景色。Invalidate() 之后:(MFC 的,顺便了)OnPaint()->OnPrepareDC()->OnDraw() 所以只是刷新在 OnPaint() 和 OnDraw() 函数中的绘图语句。其它地方没有影响。
Invalidate() 和 InvalidateRect() 的主要区别在于,Invalidate() 使整个窗口客户区无效,而 InvalidateRect() 只是增加重绘区域。InvalidateRect() 可以指定要刷新的区域,而 Invalidate() 则不能。
UpdateWindow() 函数的作用是向窗体发送 WM_PAINT 消息,但它不同于 Invalidate() 函数。UpdateWindow() 函数会检查 GetUpdateRect(hWnd,NULL,TRUE) 看有无可绘制的客户区域,如果没有,则不发送 WM_PAINT 消息。如果希望立即刷新无效区域,可以在调用 InvalidateRect() 之后调用 UpdateWindow()。UpdateWindow() 函数的优点是可以立即刷新无效区域,而 Invalidate() 函数则需要等到 WM_PAINT 消息被处理时才重绘。
在实际应用中,需要根据具体情况选择使用 Invalidate() 函数还是 InvalidateRect() 函数。如果需要使整个窗口客户区无效,可以使用 Invalidate() 函数;如果需要指定要刷新的区域,可以使用 InvalidateRect() 函数。如果需要立即刷新无效区域,可以使用 UpdateWindow() 函数。
Invalidate() 函数和 InvalidateRect() 函数都是用于触发重绘窗口的函数,它们之间存在一些关键的区别,需要根据具体情况选择使用合适的函数。