2010-12-21 62 views
3

我正在用Windows API創建一個基本的GUI,並且遇到了問題。它以一個自定義背景色打開的主窗口開始,我設置了(RGB(230,230,230))。然後它會在靜態控件的左上角顯示文本。Static Control Background Color with C++

settingstext = CreateWindow("STATIC", 
          "SETTINGS", 
          SS_LEFT | WS_CHILD, 
          12, 
          20, 
          100, 
          20, 
          hwnd, 
          NULL, 
          proginstance, 
          NULL); 
ShowWindow(settingstext, 1); 

這工作,但會顯示文字時,我需要一種方法來改變它的背景相匹配的主窗口,否則它只是看起來像它不混合。

我的問題是,我該怎麼做?我目前使用下面的方法,它的工作原理,但我想知道,有沒有辦法永久設置背景顏色,在靜態控制的CreateWindow函數之後,而不更改系統顏色,並且只適用於該方法控制,而不是任何發送消息的東西。我嘗試過在消息循環之外使用GetDC函數和SetBkColor函數,但沒有任何效果。

case WM_CTLCOLORSTATIC: 
    { 
    HDC hdcStatic = (HDC) wParam; 
    SetTextColor(hdcStatic, RGB(0,0,0)); 
    SetBkColor(hdcStatic, RGB(230,230,230)); 
    return (INT_PTR)CreateSolidBrush(RGB(230,230,230)); 
    } 

我想這樣做,因爲...

  • 我不想填補我的消息循環與需要被調用每一個窗口重新繪製時間的函數。
  • 這些更改僅適用於此靜態控件。

我會非常感謝任何可以提供的幫助,至少指出我在正確的方向,謝謝。

+1

您可以通過檢查'(HWND)lParam == settingstext'來限制'WM_CTLCOLORSTATIC'代碼對靜態控制的影響。 你的例子存在一個問題,那就是你創建的所有筆刷都不會被刪除。 – 2010-12-21 01:45:59

回答

10

對於靜態文本控件,沒有設置文本顏色或背景的永久方法。即使您想要將更改應用於單個靜態控件,當控件即將繪製時,您仍然必須在父dlgproc中處理WM_CTLCOLORSTATIC通知消息。

static HBRUSH hBrush = CreateSolidBrush(RGB(230,230,230)); 

case WM_CTLCOLORSTATIC: 
{ 
    if (settingstext == (HWND)lParam) 

       //OR if the handle is unavailable to you, get ctrl ID 

    DWORD CtrlID = GetDlgCtrlID((HWND)lParam); //Window Control ID 
    if (CtrlID == IDC_STATIC1) //If desired control 
    { 
     HDC hdcStatic = (HDC) wParam; 
     SetTextColor(hdcStatic, RGB(0,0,0)); 
     SetBkColor(hdcStatic, RGB(230,230,230)); 
     return (INT_PTR)hBrush; 
    } 
} 

如果你正在尋找使控制的背景透明瞭,你可以使用SetBkMode(hdcStatic, TRANSPARENT)父對話框。

+1

如果你已經調用過SetBkColor,你能解釋爲什麼你需要爲背景創建'hBrush'嗎?而在透明背景的情況下,你是否還需要透明的畫筆? – Ameen 2015-12-05 15:26:56

1

你有沒有考慮繼承靜態窗口並做所有者繪製?

+0

我不知道這是什麼,所以我會做一些快速研究的子類。 – contrapsych 2010-12-21 01:28:03

+0

基本上,它意味着你有消息發送到靜態控制,而不是去你的代碼(不要忘記把那些你不處理的原始處理程序)。如果你處理後臺擦除和繪製消息,那麼你可以讓窗口顯示任何你想要的。 – 2010-12-21 01:30:21

+0

因此,這將使它只發生在單一控件上,是否還有一種方法可以減少我爲該控件製作的自定義過程中的函數數量。基本上,我對整個「程序中不是很多功能」的看法是,它似乎會減慢應用程序在每次必須重新繪製時不得不執行這些功能,或者這不是什麼大問題? – contrapsych 2010-12-21 01:43:32

1

我認爲有一個永久性的方法來做到這一點。

在創建標籤之後,使用GetDC()函數獲取設備上下文。 然後用:

SetTextColor(hdcStatic, RGB(0,0,0)); 
SetBkColor(hdcStatic, RGB(230,230,230)); // Code Copied from the above answer by cpx. 

它應該這樣做。