在这种情况下如何使用双缓冲区?

时间:2009-09-27 11:04:29

标签: c++ visual-c++ mfc doublebuffered

假设我有三个控件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函数中的动作合并到缓冲区中?

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

提前致谢!

5 个答案:

答案 0 :(得分:2)

闪烁很多的helpes是重载erasebackground方法。此方法用纯色填充整个背景。油漆比涂上它的所有物品。通过移除擦除背景,涂料将只涂抹已经存在的东西,从而消除闪烁。

答案 1 :(得分:1)

CS_PARENTDC将提供帮助。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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