2009-09-27 111 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方法,所以閃爍不會在那裏。