2011-10-10 107 views
3

我一直在Google上搜索幾天,我所得到的只是相同的答案,但不是我想要的(我將描述我以後不想要的東西)。MFC:如何避免在子控件更新中閃爍?

我要的是:

  • 說我有了一些靜態控件的子控件父對話框。
  • 父對話框在對焦時使用黑色作爲背景,而在未對焦時使用灰色。
  • 孩子靜態控件只顯示文本,但它的背景需要遵循父母的背景色

問題:

  • 我能得到孩子的控件始終跟蹤父的顏色但是更新顏色的過程很慢並且會導致閃爍。
  • 當我將對話框放在焦點上時,我可以看到對話框的顏色從灰色變爲黑色,然後每個文本控件也從灰色變爲黑色。
  • 這很慢,因爲它在嵌入式設備上。

雙緩衝將不起作用,因爲父母和孩子有自己的繪畫例程,所以我認爲不可能共享相同的緩衝區。我已經讀過WS_EX_COMPOSITE或其他一些適用於Vista的東西,但我在低端操作系統上。

我不需要什麼:

  • 我已經知道如何重寫背景擦除程序(這就是爲什麼我已經得到控制,以更新)
  • 我知道如何普遍使用CMemDC類,但正如所述,它不適用於我的情況。

任何想法,傢伙?我確信處理速度是其中的一部分,但我堅信這只是一種技術或設置,我沒有做到這一點。我記得我的第一臺PC是133MHz,但當他們的父母失去焦點時,我不記得Windows 95更新控制 - 他們幾乎立即更新。那時我甚至沒有一張好的視頻卡。

請幫忙。

增加: - 我試圖使控件的BkMode是透明的,甚至使用NULL_BRUSH。所有這些與ON_WM_CTLCOLOR一起。我得到的只是一個帶孔的對話框,在這些孔中是控制文本。換句話說,不是控件的背景,而是簡單地沒有繪製(如NULL_BRUSH所預期的那樣),但是該區域沒有被對話框的繪畫作業覆蓋。 - 我正在考慮刪除WS_CLIPCHILDREN,但是我相信這會導致控件無論如何被拖動,所以再次閃爍。

+0

我不知道任何關於MFC的,所以請問如果這不是一個相關的問題,但它是不可能的只是設置子控件有一個透明的背景? –

+0

啊,是的,我也想到了這一點。我會更新我的初始文章,以反映我曾經遇到的問題。 – Ryuu

+0

您使用的是哪個版本的MFC和Visual Studio? – ChrisBD

回答

0

您是否試圖覆蓋WM_CTLCOLOR?檢出my answer to this post

注意:您可以使用pDC->SetBkColor設置靜態控件的背景顏色,並使用您想要的顏色返回畫筆。

+0

嗨djeidot。是的,我使用了所有這些,並且它可以改變背景顏色。但問題是如何避免閃爍,而不是如何改變顏色。 「父母更新第一,然後個別孩子以後更新」的過程在我的平臺上太慢了。 – Ryuu

+0

「WM_CTLCOLOR」的想法是避免使用可能導致閃爍的「WM_PAINT」或「WM_ERASEBKGND」。你應該知道你也可以用'WM_CTLCOLOR'來改變對話框的背景顏色。 – djeidot

1

你試過SetRedraw()嗎?您可以爲子窗口調用SetRedraw(FALSE),以便每次更改父窗口時都不會自動更新,而且父窗口編輯完成後,您最終可以爲子窗口調用SetRedraw(TRUE) - 並且當時可能無效,以便它們自動更新只有一次。

0

我之前通過重寫對話框的擦除背景來完成此操作。然後,不是調用默認函數,而是準備區域,遍歷對話框的所有子項並從該區域中刪除它們的邊界。最後,用對話框背景顏色填充矩形。

基本上,這個想法是隻擦除沒有控件的地方。

這會,但我不知道是否有更好的方式來做到這一點。就像'剪輯兒童'選項,或者我相信有雙緩衝的風格。