私人显示设备上下文

【勇芳软件工作室】汉化HomePreviousNext

A 【私人DC】使应用程序能够在应用程序每次绘制窗口时避免检索和初始化显示DC。私有DC对于需要对DC的属性的值进行许多更改以准备绘图的窗口很有用。专用DC可以减少准备DC所需的时间,从而减少在窗口中进行绘图所需的时间。

应用程序通过在窗口类中指定CS_OWNDC样式来指示Windows为窗口创建私有DC。每次创建属于该类的新窗口时,Windows都会创建一个唯一的私有DC。最初,私有DC具有与普通DC相同的属性默认值,但应用程序可以随时修改这些值。窗口保留对窗口生命周期中DC的更改,或者直到应用程序进行其他更改。

应用程序可以在创建窗口后随时使用GetDC函数检索私有DC的句柄。应用程序只能检索一次句柄。此后可以随时随地使用手柄。因为私有DC不是显示器DC缓存的一部分,因此应用程序不需要使用ReleaseDC函数释放DC。

Windows会自动调整DC以反映窗口的更改,例如移动或调整大小。这确保任何重叠的窗口总是被正确地剪切;也就是说,应用程序不需要任何动作来确保剪切。但是,Windows不修改DC以包含更新区域。因此,当处理WM_PAINT消息时,应用程序必须通过调用BeginPaint或通过检索更新区域并将其与当前剪切区域相交合并更新区域。如果应用程序不调用BeginPaint,它必须使用ValidateRectValidateRgn功能显式验证更新区域。如果应用程序未验证更新区域,窗口将收到一系列无限的WM_PAINT消息。

因为BeginPaint隐藏插入符,如果窗口显示,则调用BeginPaint的应用程序也应调用EndPaint功能来恢复插入符号。EndPaint对私人DC没有其他影响。

虽然私有DC方便使用,但是在系统资源方面是昂贵的,需要800个或更多的字节来存储。当性能考虑因素超过存储成本时,建议使用私人DC。

发送WM_ERASEBKGND消息到应用程序时,Windows包括专用DC。当应用程序或Windows处理这些消息时,私有DC的当前选择(包括映射模式)将生效。为了避免不必要的影响,Windows在删除背景时使用逻辑坐标;例如,它使用GetClipBox函数来检索要擦除的区域的逻辑坐标,并将这些坐标传递给FillRect函数。处理这些消息的应用程序可以使用类似的技术。Windows提供带有WM_ICONERASEBKGND消息的窗口DC,无论相应窗口是否具有专用DC。

应用程序可以使用GetDCEx功能强制Windows返回具有专用DC的窗口的公共DC。这对于在不改变私有DC的属性的当前值的情况下对窗口进行快速触摸是有用的。