2014-01-13 23 views
1

我使用普通的winapi c來創建一個GUI,我對這種語言很陌生,並且很多人可能認爲它是基本的東西。有人請向我解釋我如何更改靜態文本的背景顏色,因爲目前是透明的。我使用的文本的代碼是:plain winapi c GUI改變靜態文本背景

hwndStatic = CreateWindow(TEXT("static"), TEXT(""), 
       WS_CHILD | WS_VISIBLE, 
       10, 70, 90, 25, hwnd, NULL, g_hinst, NULL); 

回答

0

響應程序中的WM_CTLCOLORSTATIC消息,並將它返回正確的顏色的畫筆對象。

我稍微從鏈接修改的例子:

case WM_CTLCOLORSTATIC: 
    { 
     HWND hWnd = (HWND) lParam; 
     if (hWnd == hMyStatic) 
     { 
      HBRUSH hbrBkgnd = CreateSolidBrush(RGB(0,0,0)); 
      return (INT_PTR)hbrBkgnd; 
     } 
     return 0; 
    } 
+0

感謝您的非常快的答覆!我試圖添加這個,但得到了以下錯誤:錯誤#2048:未聲明的標識符'hMyStatic'。 和錯誤#2168:'=='的操作數具有不兼容的類型'HWND'和'int'。這可能是一個簡單的修復,但我今天剛剛開始使用這種語言,我仍然在學習,所以我很掙扎,並希望得到您的幫助。 –

+0

對於之前的請求感到抱歉,由於我更改了hMyStatic,因此現在似乎有點工作。 –

+1

@RahulKhosla,我不得不承認這個例子並不完整 - 你需要將刷柄保存在某個地方,並在將來的某個地方刪除它。 –

1

一般情況下,通過處理WM_GETCTLCOLORSTATIC更改靜態文本控件的繪製。

在該處理程序中,您可以更改有關DC的內容,如文本顏色,背景模式,背景顏色,甚至是選定的字體。

您還可以返回GDI畫筆的句柄(使用類型轉換系統獲取它)。該控件將首先使用畫筆擦除自身,然後繪製文本。

對於當前窗口的子項目的所有靜態控件都會發生回調,因此您首先需要測試以確定它是否是您關心的子項。

例如:

case WM_CTLCOLORSTATIC: 
    HWND hwnd = (HWND) lParam; 
    if (hwnd == hwndStatic) { 
    HDC hdc = (HDC) wParam; 
    ::SetTextColor(hdc, RGB(0xFF, 0, 0)); // set the text to red 
    ::SetBkMode(hdc, OPAQUE); 
    ::SetBkColor(hdc, RGB(0x00, 0xFF, 0x00)); // set background to green 
    HBRUSH hbrBackground = ::GetSysColorBrush(COLOR_WINDOW); 
    return (INT_PTR) hbrBackground; 
    } 
    return 0; 

這說明幾件事情可以做。你可能不想做所有這些,但看到他們都在行動,這可能是有教育意義的。

請注意,如果您創建畫筆以返回,則必須跟蹤它並稍後刪除它。我通過依靠GetSysColorBrush避免了這個問題。系統擁有這些,所以你不應該刪除它們。您還可以使用GetStockObject作爲您不必管理的系統GDI對象。但是如果您需要自定義顏色,則必須使用CreateSolidBrush然後清理它。