2009-09-27 99 views
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函数合并到缓冲区中?

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

在此先感谢!

+0

当你说:对话......你是说他们是单独的窗口? (所以CDialog?) – Toad 2009-09-27 11:15:24

+0

是的,所有的对话框都从CDialog继承〜 – MemoryLeak 2009-09-27 11:16:23

回答

2

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

+0

但我的问题是我如何合并B的ondraw中的动作和C的ondraw函数到缓冲区中?让我说,当我拖动C,B和C将被重画,序列是B先画,然后C,它完成了他们自己的抽取函数,并且我想将它们缓冲到一个位图中,然后将它绘制在顶部A.但我不知道该怎么做。 – MemoryLeak 2009-09-27 11:35:15

+0

我无法想象2个独立的窗口可以使用1个离屏位图重绘。为此,您需要将对话框设置为除独立窗口之外的其他对象。 – Toad 2009-09-27 11:41:40

+0

嗨...我刚看到你的测试图像。对话框是否真的完全由你画出(所以没有对它的控制?)在这种情况下,为什么要打扰CDialog,而不是直接在主窗口上直接绘制它们,从而消除闪烁一起 – Toad 2009-09-27 11:46:14

1

CS_PARENTDC将提供帮助。

0

假设B和C是A的孩子(通常是对话框),A应该有WS_CLIPCHILDREN样式集。如果B和C是A的同胞,请设置A的WS_CLIPSIBLINGS位。

0

拿一个MemDC主对话框A和联合MemDC对于B & C. 现在,当u拖动C,你应该结合这2 MemDC根据当前位置 使用BitBlt函数,然后最后你要做的组合的memDC在对话框的实际DC上的bitblt。

除此之外,你必须重写onerasebackground方法,所以闪烁不会在那里。

相关问题