假设我有三个控件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函数中的动作合并到缓冲区中?希望有人知道我说了什么。
提前致谢!
答案 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方法,因此不会出现闪烁。