0

所以我正在通过“Programming Windows - Charles Petzold(第 5 版)”一书学习 Windows API。如果我理解正确,在处理 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 ;

这是作者的错误吗?我认为 InvalidateRect() 应该在使用 GetDC()/ReleaseDC() 之后调用,而不是在 WM_PAINT 消息中。

4

3 回答 3

3

The one thing this does is force the entire window to be invalid and not just whatever happens to be invalid (for instance due to an overlapped window being moved out of the way).

I'm not sure that it matters in this case but that is what the call accomplishes.

于 2020-09-03T18:31:10.253 回答
1

根据文件

系统不是WM_PAINT消息的唯一来源。InvalidateRectInvalidateRgn函数可以间接为您的窗口生成WM_PAINT消息。这些函数将客户区的全部或部分标记为无效(必须重新绘制)。

所以也许作者想把一个客户区全部标记为无效,但是在这个例子中这样做没有意义,因为WM_PAINT消息是在表单被标记为无效之后触发的,所以添加或删除这行代码不会有影响。

于 2020-09-04T02:15:09.413 回答
0

答案是:不,这不是作者的错误。函数调用 InvalidateRect() 是正确的消息,并导致在所有情况下都重新绘制整个客户区(正如我所假设的,但我不是 100% 确定,所以这就是我寻求帮助的原因)。如果你有这本书并且难以理解这个例子,请试着理解代码中的每一行。我花了一周的时间才明白为什么会调用 InvalidateRect() 函数。

谢谢大家的回答,非常感谢!

于 2020-09-08T10:25:40.150 回答