2

假设我有三个控件A,B,C。它们都是从CDialog继承的,A是一个主对话框,A包含B,B包含C。每次我用鼠标拖动C,B和C都会一起移动.

这是一张图片:http: //img507.imageshack.us/img507/7039/31709956.jpg

我们知道这会导致 B 和 C 重新绘制自己。并且可能会导致闪烁。

我的问题是是否有一种方法可以对这两个对话框 B 和 C 进行双重缓冲?

我知道在 XP 和 vista 中,有一个属性 WS_EX_COMPOSITED 会有所帮助,但我不想使用它。

有人可能会建议我使用 memDC,但我的问题是如何将 B 的 ondraw 和 C 的 ondraw 函数中的动作合并到缓冲区中?

希望有人知道我说了什么。

提前致谢!

4

5 回答 5

2

对闪烁有很大帮助的是重载erasebackground方法。此方法用纯色填充整个背景。油漆比油漆上面的所有物品。通过删除擦除背景,油漆只会在已经存在的东西上绘画,从而消除闪烁。

于 2009-09-27T11:16:42.183 回答
1

CS_PARENTDC 会有所帮助。

于 2009-09-27T11:34:20.060 回答
1

我自己从来没有搞过双缓冲 Windows 的绘图调用,但我曾经在微软论坛上遇到过关于它的讨论:http: //social.msdn.microsoft.com/forums/en-US/vcgeneral/thread /789a4116-d3b2-488e-801a-3f7bc1e4d33a/也许这对你有帮助。

于 2009-09-27T18:17:29.993 回答
0

假设 B 和 C 是 A 的孩子(对话框的常见情况),A 应该有WS_CLIPCHILDREN样式集。如果 B 和 C 是 A 的兄弟姐妹,则设置 A 的WS_CLIPSIBLINGS位。

于 2009-09-28T19:43:45.210 回答
0

将一个 MemDC 用于主对话框 A,将组合 MemDC 用于 B 和 C。现在,当您拖动 C 时,您应该使用 BitBlt 函数根据当前位置组合这两个 MemDC,然后最后您必须在实际中执行组合 memDC 的 bitblt对话的 DC。

除此之外,您还必须覆盖 onerasebackground 方法,因此不会出现闪烁。

于 2009-10-23T07:14:01.517 回答