为什么在 WM_PAINT 消息中调用 InvalidateRect()?
Why call InvalidateRect() in WM_PAINT message?
所以我正在学习 Windows API 书籍“编程 Windows - Charles Petzold(第 5 版)”。如果我理解正确,在处理 WM_PAINT 消息时调用函数 BeginPaint() 验证必须更新的给定区域。然而,在这本书(PDF版第145页或印刷版第128页)中,您可以看到这段代码:
case WM_PAINT:
InvalidateRect (hwnd, NULL, TRUE) ; // what does this line do?
hdc = BeginPaint (hwnd, &ps) ;
DrawBezier (hdc, apt) ;
EndPaint (hwnd, &ps) ;
return 0 ;
作者是不是搞错了?我认为应该在使用 GetDC()/ReleaseDC() 之后而不是在 WM_PAINT 消息中调用 InvalidateRect()。
这样做的一件事是强制整个 window 无效,而不仅仅是无效的任何内容(例如由于重叠的 window 被移开)。
我不确定在这种情况下它是否重要,但这就是调用所完成的。
根据 document:
The system is not the only source of WM_PAINT messages. The InvalidateRect or InvalidateRgn function can indirectly generate WM_PAINT messages for your windows. These functions mark all or part of a client area as invalid (that must be redrawn).
所以也许作者想将整个客户区标记为无效,但在这个例子中这样做没有意义,因为 WM_PAINT
消息是在表单被标记后触发的无效,增删此行代码无影响
答案是:不,这不是作者的错误。函数调用 InvalidateRect() 在正确的消息中,并导致在所有情况下重新绘制整个客户区(正如我所假设的,但我不是 100% 确定,所以这就是我寻求帮助的原因)。
如果你有这本书并且难以理解这个例子,请尝试理解代码中的每一行。我花了一个星期才明白为什么要调用 InvalidateRect() 函数。
谢谢大家的回答,非常感谢!
所以我正在学习 Windows API 书籍“编程 Windows - Charles Petzold(第 5 版)”。如果我理解正确,在处理 WM_PAINT 消息时调用函数 BeginPaint() 验证必须更新的给定区域。然而,在这本书(PDF版第145页或印刷版第128页)中,您可以看到这段代码:
case WM_PAINT:
InvalidateRect (hwnd, NULL, TRUE) ; // what does this line do?
hdc = BeginPaint (hwnd, &ps) ;
DrawBezier (hdc, apt) ;
EndPaint (hwnd, &ps) ;
return 0 ;
作者是不是搞错了?我认为应该在使用 GetDC()/ReleaseDC() 之后而不是在 WM_PAINT 消息中调用 InvalidateRect()。
这样做的一件事是强制整个 window 无效,而不仅仅是无效的任何内容(例如由于重叠的 window 被移开)。
我不确定在这种情况下它是否重要,但这就是调用所完成的。
根据 document:
The system is not the only source of WM_PAINT messages. The InvalidateRect or InvalidateRgn function can indirectly generate WM_PAINT messages for your windows. These functions mark all or part of a client area as invalid (that must be redrawn).
所以也许作者想将整个客户区标记为无效,但在这个例子中这样做没有意义,因为 WM_PAINT
消息是在表单被标记后触发的无效,增删此行代码无影响
答案是:不,这不是作者的错误。函数调用 InvalidateRect() 在正确的消息中,并导致在所有情况下重新绘制整个客户区(正如我所假设的,但我不是 100% 确定,所以这就是我寻求帮助的原因)。 如果你有这本书并且难以理解这个例子,请尝试理解代码中的每一行。我花了一个星期才明白为什么要调用 InvalidateRect() 函数。
谢谢大家的回答,非常感谢!