处理 WM_PAINT 消息期间执行的大多数绘图都是异步的;也就是说,窗口部分失效的时间与发送WM_PAINT的时间之间存在延迟。 在延迟期间,应用程序通常会从队列中检索消息并执行其他任务。 延迟的原因是,系统通常将窗口中的绘图视为低优先级作,并像用户输入消息和可能影响窗口位置或大小的消息一样在WM_PAINT之前进行处理。
在某些情况下,应用程序必须同步绘制,即在使窗口部分失效后立即在窗口中绘图。 典型的应用程序在创建窗口后立即绘制其主窗口,以向用户发出应用程序已成功启动的信号。 系统以同步方式绘制一些控件窗口,例如按钮,因为此类窗口充当用户输入的焦点。 尽管任何具有简单绘图例程的窗口都可以同步绘制,但所有此类绘图都应快速完成,不应干扰应用程序响应用户输入的能力。
UpdateWindow 和 RedrawWindow 函数允许同步绘制。 如果更新区域不为空,UpdateWindow 将 WM_PAINT 消息直接发送到窗口。 RedrawWindow 还会发送 WM_PAINT 消息,但可让应用程序更好地控制如何绘制窗口,例如是否绘制非工作区和窗口背景,还是发送消息,而不管更新区域是否为空。 这些函数将 WM_PAINT 消息直接发送到窗口,而不考虑应用程序消息队列中的其他消息数。
任何需要耗时绘图操作的窗口都应异步绘制,以防止在绘制窗口时阻止未处理的消息。 此外,任何经常使窗口小部分失效的应用程序都应允许这些无效部分合并为单个异步 WM_PAINT 消息,而不是一系列同步 WM_PAINT 消息。