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

C++ 在这种情况下如何使用双缓冲区?,c++,visual-c++,mfc,doublebuffered,C++,Visual C++,Mfc,Doublebuffered,假设我有三个控件A、B、C,它们都是从CDialog继承的, A是主对话框,A包含B,B包含C。 每次我用鼠标拖动C,B和C就会一起移动 这是一幅图像: 我们知道这将导致B和C重新绘制它们自己。它可能会引起闪烁 我的问题是,是否有一种方法可以双重缓冲这两个对话框B和C 我知道在XP和vista中,有一个属性WS_EX_COMPOSITED会有帮助,但我不想使用这个 有人可能会建议我使用memDC,但我的问题是如何将B的ondraw和C的ondraw函数中的操作合并到缓冲区中 希望有人知道我说了什

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

这是一幅图像:

我们知道这将导致B和C重新绘制它们自己。它可能会引起闪烁

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

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


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

希望有人知道我说了什么


提前谢谢

最有助于闪烁的是重载erasebackground方法。此方法使用纯色填充整个背景。这幅画比它上面所有的东西都要好看。通过去除背景,绘画只会覆盖已经存在的东西,从而消除闪烁。

CS\u PARENTDC会有所帮助。

我从来没有弄乱过双缓冲窗口的绘画调用,但是我曾经在微软论坛上遇到过一个关于它的讨论:也许这对你会有帮助。

假设B和C是a的孩子(对话框的常见情况),a应该设置
WS\u CLIPCHILDREN
样式。如果B和C是A的同级,则设置A的
WS\u CLIPSIBLINGS
位。

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


除此之外,您还必须重写onerasebackground方法,这样就不会出现闪烁。

当您说:dialog。。。你是说它们是分开的窗户吗?(那么CDialog呢?)是的,所有对话框都是从CDialog~继承的,但我的问题是如何将B的ondraw和C的ondraw函数中的操作合并到缓冲区中?比如说,当我拖动C时,B和C将被重新绘制,顺序是B先绘制,然后是C,这是在他们自己的ondraw函数中完成的,我想将它们加倍缓冲到位图中,然后在a上绘制。但是我不知道如何做。我无法想象使用一个屏幕外位图可以重新绘制两个单独的窗口。要做到这一点,你需要的对话框,而不是单独的窗口。嗨…我刚刚看到你的测试图像。对话框真的是完全由您绘制的吗(所以没有控件?)在这种情况下,为什么还要麻烦使用CDialog,而不直接在主窗口上绘制它们,从而消除闪烁呢?因为我将在子对话框C上添加一些事件处理程序,例如drag and dropWS_EX_COMPOSITED,该属性可以将其所有子项缓冲到缓冲区中,然后绘制它。但我不想用这个。。。。