65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 MFC 方法进行无闪烁绘制

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.78/5 (18投票s)

2002 年 6 月 14 日

CPOL

2分钟阅读

viewsIcon

353847

downloadIcon

3617

如何在使用 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 的标志,以便正确绘制背景。

一些技巧

实现无闪烁绘图并避免副作用的一些技巧是:

  1. 在内存 DC 上绘制图片时,你可以假设一个矩形,其左上角位于 (0,0)。然后,当你使用 BitBlt 将其复制到真实的 DC 上时,你可以通过 x 和 y 参数指定真实的左上角。这样,你就可以轻松地在未来移动绘图区域,因为唯一需要更改的地方是 BitBlt 的 x 和 y 参数。
  2. 每当你通过调用 InvalidateRect(&rect_yourDrawArea) 更新绘图时,设置一个标志,以便 OnEraseBkgnd 将被绕过。在 OnPaint 的末尾,清除该标志,以便在其他情况下擦除背景。
  3. 当框架调整大小、滚动条被拖动或窗口被重新激活时,WM_NCPAINT 总是会被发送到你的程序。在这种情况下,你会清除你的 EraseBkgnd 标志,以便擦除背景,而不是给你一个透明的客户端区域。

End

详细信息在源代码中。由于它非常清晰易懂,我不会在这里浪费口舌。希望这篇文章对你有所帮助。感谢阅读。

© . All rights reserved.