2010-08-11 100 views
17

我沒有使用一個對話框,即時通訊使用我已經註冊,然後使用CreateWindow的調用來創建自己的自定義類,我已經註冊時預設的背景色爲紅色:如何在註冊後設置窗口的背景顏色?

WNDCLASSEX wc; 
wc.hbrBackground = CreateSolidBrush(RGB(255, 0, 0)); 

,但現在我想要在運行時改變背景顏色,例如點擊一個按鈕將其更改爲藍色。

我試圖在WM_PAINT中使用SetBkColor()調用,並試圖從WM_CTLCOLORDLG消息返回一個畫筆,它們不起作用。

有幫助嗎?

回答

17

Window Background說到:

...該系統描繪了 窗口的背景或給窗口的 機會,這樣做的當 應用程序調用BeginPaint時,向其發送一個 WM_ERASEBKGND消息。如果一個應用程序 不處理 消息,但它傳遞給 DefWindowProc函數,該系統通過在後臺刷由窗口的類指定的 圖案 填充它.....

擦除 背景.. ....即使定義了一個 類背景畫筆,應用程序也可以處理WM_ERASEBKGND消息。 這是 允許用戶更改窗口 背景顏色或 指定窗口的模式而不會影響該類中的其他窗口的應用程序中的典型應用程序。在這種情況下,應用程序不得將 消息傳遞給DefWindowProc。 .....

因此,使用WM_ERASEBKGND消息的wParam來獲取DC並繪製背景。

+0

我會試試這個,謝謝 – Kaije 2010-08-11 23:06:49

+0

是的,它的工作。我處理了這個消息,並使用FillRect()調用來繪製我的背景 – Kaije 2010-08-11 23:24:29

+0

我對Windows C++有點新鮮。這裏的DC是什麼意思? – 2018-01-25 18:13:36

10

你可以嘗試以下方法:

HBRUSH brush = CreateSolidBrush(RGB(0, 0, 255)); 
    SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG)brush); 
+0

這改變了該類的所有實例。您還需要使窗口無效以使其擦除並重新繪製。 – 2010-08-11 23:02:10

+0

是的,這工作,但我有我自己的類包裝和我想要註冊後設置它的原因是因爲我想從同一類的窗口有不同的背景顏色 – Kaije 2010-08-11 23:05:01

+0

工作像WTL的魅力! – sailfish009 2017-12-21 09:18:38

4

簡短回答:處理WM_ERASEBKGND

較長的答案:

當您註冊WNDCLASS,你提供有關這個類的所有窗口的信息。所以如果你想改變一個窗口實例的顏色,你需要自己處理。

當您需要重新繪製窗口時,系統會發送您的wndproc一條WM_ERASEBKGND消息。如果您不處理它,DefWindowProc將使用窗口類中的顏色擦除客戶區。但是你可以直接處理消息,繪製你喜歡的任何顏色(或背景圖案)。