同步和异步绘图

在处理 WM_PAINT 消息期间执行的大多数绘图都是异步的;也就是说,窗口的一部分失效与发送WM_PAINT的时间之间存在延迟。 在延迟期间,应用程序通常会从队列中检索消息并执行其他任务。 延迟的原因是,系统通常将窗口中的绘图视为低优先级操作,其工作原理就像用户输入消息和可能影响窗口位置或大小的消息在WM_PAINT 之前进行处理。

在某些情况下,应用程序需要同步绘制,即在使窗口的一部分失效后立即在窗口中绘制。 典型的应用程序在创建窗口后立即绘制其main窗口,以向用户发出应用程序已成功启动的信号。 系统同步绘制某些控件窗口(如按钮),因为此类窗口充当用户输入的焦点。 尽管任何具有简单绘图例程的窗口都可以同步绘制,但所有此类绘制都应快速完成,并且不应干扰应用程序响应用户输入的能力。

UpdateWindowRedrawWindow 函数允许同步绘制。 如果更新区域不为空,UpdateWindow 会将WM_PAINT消息直接发送到窗口。 RedrawWindow 还会发送 WM_PAINT 消息,但可让应用程序更好地控制如何绘制窗口,例如是否绘制非工作区和窗口背景,或者无论更新区域是否为空,是否发送消息。 这些函数将 WM_PAINT 消息直接发送到窗口,而不考虑应用程序消息队列中的其他消息数。

任何需要耗时的绘制操作的窗口都应异步绘制,以防止在绘制窗口时阻止挂起的消息。 此外,任何经常使窗口的一小部分失效的应用程序都应允许这些无效部分合并为单个异步 WM_PAINT 消息,而不是一系列同步 WM_PAINT 消息。