2016-03-26 103 views
1

我開發了一個win32應用程序並使用this example創建顏色選擇器。我更新如果像this這樣的語句更改我的應用程序的背景,當用戶單擊顏色對話框中的「確定」時,但沒有任何更改。我的錯誤在哪裏?無法更改窗口的背景

if (ChooseColor(&cc) == TRUE) { 
    HBRUSH hbrush = CreateSolidBrush(cc.rgbResult); 
    rgbCurrent = cc.rgbResult; 
    SetClassLongPtr(hWnd, GCLP_HBRBACKGROUND, (LONG)hbrush); 
} 
+1

您需要使用靜態畫筆。每次創建一個新表示資源泄漏。 – DimChtz

+0

您需要WM_ERASEBKGND,請參閱您發佈的SO鏈接中接受的安裝程序。 – Joel

+0

不要將'hbrush'強制轉換爲'LONG','SetClassLongPtr'的全部內容是參數是'LONG_PTR'。 –

回答

1

下面的代碼可以工作。首先,SetClassLongPtr()返回前一個值,在此例中爲先前設置爲窗口類(hWnd)的HBRUSH。您應該刪除該對象以避免內存泄漏。

之後,調用InvalidateRect()將使顏色更改生效。因爲新創建的畫筆將在窗口需要重新繪製時使用。

InvalidateRect()將WM_ERASEBKGND發送到窗口。

if (ChooseColor(&cc) == TRUE) { 
    HBRUSH hbrush = CreateSolidBrush(cc.rgbResult); 
    HBRUSH hOldBrush = (HBRUSH)SetClassLongPtr(hWnd, GCLP_HBRBACKGROUND, (LONG_PTR)hbrush); 

    DeleteObject(hOldBrush); 
    InvalidateRect(hWnd, NULL, 1); 
} 
+1

請注意,這會更改該類的所有Windows的背景色,而不僅僅是由'hWnd'表示的背景色。您應該使用'WM_ERASEBKGND'自定義擦除窗口,以便只有一個窗口更改其背景色。 –