正确使用Win32设备上下文

问题描述

我已经使用GDI一段时间了,我正在努力加深对它的了解,以便能够为其创建包装器类。

  1. 为什么在应用程序结束之前我不能坚持使用窗口设备上下文?它会在任何事件中失效吗?我听说有人说WM_SIZE之后上下文无效,这是真的吗?即使我总是缓存窗口上下文,我也从未经历过。这使得在构造函数中创建createCompatibleDC()和createCompatibleBitmaps()更加容易。我还缓存了这些创建的DC,并使用它们来避免闪烁,对于局部边界绘制,如果窗口最小化然后最大化,则缓存绘制操作。

  2. 为什么应用程序一次要获取多个窗口上下文?由于文档记录抱怨超出窗口上下文限制。

解决方法

请记住,在您所说的上下文中,“无效”意味着需要重画窗口的某些部分,但这并不意味着从GetDC检索到的句柄将变得不可用。

具有CS_HREDRAW或CS_VREDRAW的窗口将要求至少在指定方向上按任何调整大小进行部分重画,以及任何增加窗口大小的调整大小操作。

由于GDI对象数量的限制,正常的模式是处理WM_PAINT消息并使用BeginPaint返回的句柄(只要不调用EndPaint,该句柄将一直可用)。

正如一些程序员在评论中说的那样,第二个DC可以用来执行无闪烁绘制,费时的绘制是在屏幕外的DC上完成,然后简单地复制到屏幕DC上。即使完全在WM_PAINT处理程序中完成此操作,通常在绘制操作完成后也将释放屏幕外DC,以免占用GDI资源。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...