专用显示设备上下文

专用设备上下文使应用程序能够避免每次应用程序必须在窗口中绘制时检索和初始化显示设备上下文。 专用设备上下文适用于需要对设备上下文的属性值进行多次更改以准备绘制的窗口。 专用设备上下文减少了准备设备上下文所需的时间,因此缩短了在窗口中执行绘图所需的时间。

应用程序通过在窗口类中指定CS_OWNDC样式,指示系统为窗口创建专用设备上下文。 每次创建属于 类的新窗口时,系统都会创建一个唯一的专用设备上下文。 最初,专用设备上下文具有与常见设备上下文相同的属性默认值,但应用程序可以随时修改这些默认值。 系统在窗口的生存期或应用程序进行其他更改之前保留对设备上下文的更改。

创建窗口后,应用程序可以随时使用 GetDC 函数检索专用设备上下文的句柄。 应用程序只能检索句柄一次。 此后,它可以保留并使用句柄任意次数。 由于专用设备上下文不是显示设备上下文缓存的一部分,因此应用程序永远不需要使用 ReleaseDC 函数释放设备上下文。

系统会自动调整设备上下文以反映对窗口的更改,例如移动或调整大小。 这可确保始终正确剪裁任何重叠窗口;也就是说,应用程序无需执行任何操作来确保剪辑。 但是,系统不会修改设备上下文以包括更新区域。 因此,在处理 WM_PAINT 消息时,应用程序必须通过调用 BeginPaint 或通过检索更新区域并将其与当前剪辑区域相交来合并更新区域。 如果应用程序不调用 BeginPaint,则必须使用 ValidateRectValidateRgn 函数显式验证更新区域。 如果应用程序不验证更新区域,则窗口将收到一系列无休止 的WM_PAINT 消息。

由于 BeginPaint 在窗口显示插入点时隐藏插入符号,因此调用 BeginPaint 的应用程序还应调用 EndPaint 函数来还原插入点。 EndPaint 对专用设备上下文没有其他影响。

尽管专用设备上下文易于使用,但它在系统资源方面会占用大量内存,需要存储 800 个或更多字节。 当性能注意事项超过存储成本时,建议使用专用设备上下文。

向应用程序发送 WM_ERASEBKGND 消息时,系统将包含专用设备上下文。 当前选择的专用设备上下文(包括映射模式)在应用程序或系统处理这些消息时生效。 为了避免不良影响,系统在擦除背景时使用逻辑坐标;例如,它使用 GetClipBox 函数检索要擦除的区域的逻辑坐标,并将这些坐标传递给 FillRect 函数。 处理这些消息的应用程序可以使用类似的技术。

应用程序可以使用 GetDCEx 函数强制系统为具有专用设备上下文的窗口返回通用设备上下文。 这对于在不更改专用设备上下文属性的当前值的情况下对窗口执行快速触摸非常有用。