2013-07-31 149 views
0

我想在運行時更改按鈕的背景顏色。在Win32中更改子類按鈕的背景顏色

問題是,按鈕沒有黑色的背景,這是我的代碼應該產生的。 相反,它看起來有一個下拉控件的箭頭。

我究竟在做什麼錯在這裏?

首先,我子類的按鈕:

// HWND hParent is the parent window 
// HINSTANCE hInstance is the current module 
HWND h = CreateWindow("Button", NULL, WS_CHILD | WS_VISIBLE | SS_OWNERDRAW, 
         340, 10, 20, 20, 
         hParent, NULL, hInstance, NULL); 

SetWindowSubclass(h, &MyWndProc, MyButtonId, NULL); 

的ID被定義爲:

enum 
{ 
    MyButtonId = 100, 
}; 

而子類過程:

LRESULT CALLBACK MyWndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) 
{ 
    if(uIdSubclass == MyButtonId) 
    { 
     switch(msg) 
     { 
     case WM_ERASEBKGND: 
      { 
       HDC dc = (HDC)wParam; 
       SetBkColor(dc, RGB(127,127,127)); 
       return 0; 
      } 
     } 
    } 
    return DefSubclassProc(hWnd, msg, wParam, lParam); 
} 

回答

1

你沒有按鈕ID傳遞給CreateWindow函數,所以你的按鈕沒有你認爲它的ID。

SetBkColor不設置按鈕的背景。它爲隨後調用TextOut設置背景。

您可能打算使用BS_OWNERDRAW而不是SS_OWNERDRAW。

當您使用所有者繪製樣式時,必須繪製按鈕背景以及文本和邊框。您可以在WM_DRAWITEM的父窗口處理程序中執行此操作。所以你根本不需要繼承按鈕。

+0

感謝您的幫助。但我沒有父窗口的消息循環。所以我需要按照我所知的方式繼承按鈕。 –