我想立即在HWND上绘制图像(到函数返回时,该图像将被绘制)。因此,我正在考虑使用UpdateWindow()进行此操作,正如我已阅读的,UpdateWindow()将通过直接调用窗口过程而不是通过在消息队列中放置WM_PAINT消息来发送WM_PAINT消息。

但是有一种我不确定的想法,UpdateWindow()文档说:


  如果更新区域为空,则不发送消息。


“空”是什么意思?这是否意味着已通过验证?如果是这样,我应该在呼叫InvalidateRect()之前先呼叫UpdateWindow()吗?

最佳答案

如文档所述,如果没有标记为无效的更新区域,则UpdateWindow不执行任何操作。如果首先调用InvalidateRect,则更新区域将不会为空,并且UpdateWindow将按预期触发WM_PAINT

如果要强制立即完成重画,最简单的方法是使用RedrawWindow函数。这使您可以同时将区域标记为无效,并强制重画在命令返回之前进行。例如,这将强制重绘整个客户区:

RedrawWindow(hWnd, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW);

10-06 12:16