【发布时间】:2021-01-02 20:18:03
【问题描述】:
我已经使用 GDI 有一段时间了,我正在努力加深对它的理解,以便能够为它创建一个包装类。
-
为什么在应用程序结束之前我不能保持窗口设备上下文?它是否会因任何事件而失效?我听到有人说在 WM_SIZE 之后上下文变得无效,这是真的吗?即使我总是缓存窗口上下文,我也从未经历过这种情况。它使得在构造函数中创建CompatibleDC()s 和createCompatibleBitmaps()s 变得更加容易。我还缓存了这些创建的 DC 并使用它们来避免闪烁,对于局部边界绘制,缓存绘制操作以防窗口最小化然后最大化。
-
为什么应用程序一次会获取超过 1 个窗口上下文?由于文档抱怨用完窗口上下文限制。
【问题讨论】:
-
关于您的第二个问题,例如,您可以使用一个 DC 来绘制,然后将其 blit 到窗口 DC。这样可以防止直接在窗口 DC 上绘图时出现闪烁。
-
取决于如何创建 DC。如果你从 BeginPaint() 得到它,那么你会后悔缓存它,剪辑区域很容易变得陈旧。 GetDC() 没问题。如果创建对象很昂贵但存储很便宜,则缓存很有用。窗口 DC 的创建成本很低,但存储在非常有限的桌面堆中。只缓存一个无需担心。
-
@Hans 我没有缓存或使用多个窗口上下文的习惯,但是在我的系统变慢之前多少?我意外地发现,不断地创建位图而不释放会非常显着地减慢您的应用程序的速度。这意味着位图的内存非常昂贵。
-
@某程序员老兄,我的第二个问题完全是关于window dc而不是memory dc。