使用 MFC 方法进行无闪烁绘制
如何在使用 MFC 提供的各种方法时实现无闪烁绘制
引言
我刚开始学习 VC++,发现 MFC 的绘图支持一开始很容易使用。只需几行代码,就可以在客户端区域绘制任何基本的形状。但是,在实现无闪烁绘图时,我很难找到有效的方法。感谢所有 CP 社区成员,特别是 Chris Losinger、Joaquín M López Muñoz、Tim Smith、Shog、Nish、Ernest Laurentin、Kemal OZLU、Ravi Bhavnani、vaithsr,他们在我的艰难时刻帮助了我。我想分享我目前所学到的知识给其他新手。
需要处理的三个消息
- 首先,为了实现无闪烁绘图,你需要将所有内容绘制到内存 DC 上,然后使用
BitBlt
将其复制到真实的 DC 上。这称为双缓冲,在许多书籍和文章中都有介绍。 - 其次,你需要重写
OnEraseBkgnd
才能真正消除闪烁。 - 最后但并非最不重要的一点,当其他事件(而不是你的
InvalidateRect( &rect_yourDrawArea )
)发送WM_ERASEBKGND
时,你仍然希望背景被擦除。因此,你需要重写WM_NCPAINT
的处理程序,以清除绕过OnEraseBkgnd
的标志,以便正确绘制背景。
一些技巧
实现无闪烁绘图并避免副作用的一些技巧是:
- 在内存 DC 上绘制图片时,你可以假设一个矩形,其左上角位于 (0,0)。然后,当你使用
BitBlt
将其复制到真实的 DC 上时,你可以通过 x 和 y 参数指定真实的左上角。这样,你就可以轻松地在未来移动绘图区域,因为唯一需要更改的地方是BitBlt
的 x 和 y 参数。 - 每当你通过调用
InvalidateRect(&rect_yourDrawArea)
更新绘图时,设置一个标志,以便OnEraseBkgnd
将被绕过。在OnPaint
的末尾,清除该标志,以便在其他情况下擦除背景。 - 当框架调整大小、滚动条被拖动或窗口被重新激活时,
WM_NCPAINT
总是会被发送到你的程序。在这种情况下,你会清除你的EraseBkgnd
标志,以便擦除背景,而不是给你一个透明的客户端区域。
End
详细信息在源代码中。由于它非常清晰易懂,我不会在这里浪费口舌。希望这篇文章对你有所帮助。感谢阅读。