专用显示设备上下文
专用设备上下文 使应用程序能够避免每次应用程序必须在窗口中绘制时检索和初始化显示设备上下文。 专用设备上下文对于需要对设备上下文属性的值进行许多更改的窗口非常有用,以便为绘图做好准备。 专用设备上下文减少了准备设备上下文所需的时间,因此在窗口中执行绘图所需的时间。
应用程序通过在窗口类中指定CS_OWNDC样式,指示系统为窗口创建专用设备上下文。 系统每次创建属于该类的新窗口时,都会创建唯一的专用设备上下文。 最初,专用设备上下文的属性与通用设备上下文具有相同的默认值,但应用程序可以随时修改这些属性。 系统保留对窗口生存期的设备上下文的更改,或者直到应用程序进行其他更改。
应用程序可以在创建窗口后随时使用 GetDC 函数检索专用设备上下文的句柄。 应用程序必须仅检索一次句柄。 此后,它可以保留并使用句柄任意次数。 由于专用设备上下文不是显示设备上下文缓存的一部分,因此应用程序无需使用 ReleaseDC 函数释放设备上下文。
系统会自动调整设备上下文以反映对窗口的更改,例如移动或调整大小。 这可确保始终正确剪裁任何重叠窗口;也就是说,应用程序不需要执行任何作来确保剪辑。 但是,系统不会修改设备上下文以包含更新区域。 因此,在处理 WM_PAINT 消息时,应用程序必须通过调用 BeginPaint 或检索更新区域并将其与当前剪辑区域相交来合并更新区域。 如果应用程序未 BeginPaint调用,则必须使用 ValidateRect 或 ValidateRgn 函数显式验证更新区域。 如果应用程序未验证更新区域,窗口将收到一系列无休止的 WM_PAINT 消息。
由于 BeginPaint 在显示窗口时隐藏插入符号,因此调用 BeginPaint 的应用程序还应调用 EndPaint 函数来还原插入点。 EndPaint 对专用设备上下文没有其他影响。
尽管专用设备上下文易于使用,但在系统资源方面,内存密集型,需要存储 800 个或更多字节。 当性能注意事项超过存储成本时,建议使用专用设备上下文。
系统在向应用程序发送 WM_ERASEBKGND 消息时包括专用设备上下文。 当应用程序或系统处理这些消息时,专用设备上下文(包括映射模式)的当前选择生效。 为了避免不良影响,系统在擦除背景时使用逻辑坐标;例如,它使用 GetClipBox 函数检索要擦除的区域逻辑坐标,并将这些坐标传递给 FillRect 函数。 处理这些消息的应用程序可以使用类似的技术。
应用程序可以使用 GetDCEx 函数强制系统为具有专用设备上下文的窗口返回公共设备上下文。 这对于在不更改专用设备上下文属性的当前值的情况下,对窗口执行快速接触非常有用。