绘图没有闪烁

时间:2011-09-21 15:17:46

标签: c++ winapi drawing flicker

我有一个用c ++开发的win32应用程序。应用程序使用基本形状(矩形)在窗口上绘制一些东西。使用InvalidateRect每20ms(50hz)重新绘制窗口。一切都运作良好,但绘图闪烁。我怎样才能防止闪烁?在c#中我通常使用双缓冲组件(如pictureBox),我怎样才能在使用win32的c ++中摆脱这个?

4 个答案:

答案 0 :(得分:6)

您可以创建内存设备上下文,将这些形状绘制到它(就像您对窗口的设备上下文一样),然后在窗口无效时从窗口的设备上下文中blit。

您还需要在绘制之前禁用背景清除(适当处理WM_ERASEBKGND窗口消息)。

编辑:我偶然发现了一个非常详尽的tutorial关于GDI中无闪烁绘图的内容,它解释了Windows中绘图的所有方面,并附带了示例。

答案 1 :(得分:4)

您也可以在Win32中轻松实现双缓冲。假设您正在使用其设备上下文直接在Window上进行绘制,请执行以下操作:

创建“内存”设备上下文并在该设备上下文上执行所有绘制,然后在适当的时候使用BitBlt()函数将窗口的无效部分复制到实际的设备上下文

有一个非常好的(虽然是高级别)概述here.

答案 2 :(得分:3)

你也可以在C ++中加倍缓冲。

当您将DC绘制到时,您将创建一个屏幕外位图(CreateCompatibleBitmap)和一个内存DC(CreateCompatibleDC)。把你所有的画都做到那个DC。最后,从内存DC到实际DC执行BitBlt。

为了提高性能,您可能希望缓存屏幕外位图和DC,但请记住在窗口大小更改时重新创建它们。

答案 3 :(得分:1)

这是我发现的最好的教程:

https://msdn.microsoft.com/en-us/library/ms969905.aspx

简而言之 - 是的,你必须实现双缓冲。这是通过创建内存中的DC,然后使用该DC将所需内容绘制到内存中的位图,然后将此位图提交到实际DC来完成的。