當 static 控件或具備 ES_READONLY 風格的 edit 控件被繪製時,會向父窗口發送 WM_CTLCOLORSTATIC 消息。若是咱們在窗口過程當中處理該消息,就必須返回一個畫刷句柄,Windows 會使用該畫刷來繪製控件背景(子窗口背景)。函數
也就是說,改變 static 控件的背景顏色只有這一種方式,就是處理 WM_CTLCOLORSTATIC 消息。WM_CTLCOLORSTATIC 消息就是用來設置背景畫刷的。字體
改變 static 控件的背景顏色:ui
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ PAINTSTRUCT ps; HDC hdcWnd; static HFONT hFont; //邏輯字體 static HWND hStatic; //靜態文本框控件 static HBRUSH hBrush; //畫刷 switch (message){ case WM_CREATE: //建立畫刷 hBrush = CreateSolidBrush( RGB(0x41, 0x96, 0x4F) ); //翠綠色 //建立邏輯字體 hFont = CreateFont(-14/*高*/, -7/*寬*/, 0, 0, 400 /*400表示正常字體*/, FALSE/*斜體?*/, FALSE/*下劃線?*/, FALSE/*刪除線?*/,DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, TEXT("微軟雅黑") ); //建立靜態文本框控件 hStatic = CreateWindow(TEXT("static"), TEXT("歡迎來到C語言中文網!"), WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE | SS_CENTER, 20 /*x座標*/, 20 /*y座標*/, 240 /*寬度*/, 60 /*高度*/, hWnd /*父窗口句柄*/, (HMENU)1 /*控件ID*/, hInst /*當前程序實例句柄*/, NULL ); //設置控件的字體 SendMessage(hStatic, WM_SETFONT, (WPARAM)hFont, NULL); break; case WM_CTLCOLORSTATIC: return (INT_PTR)hBrush; //這裏必須返回畫刷句柄 case WM_PAINT: hdcWnd = BeginPaint(hWnd, &ps); // TODO: 在此添加任意繪圖代碼... EndPaint(hWnd, &ps); break; case WM_DESTROY: DeleteObject(hBrush); DeleteObject(hFont); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
運行結果:spa
修改文字背景顏色
上圖中,咱們的代碼只是改變了控件的背景顏色(整個子窗口的背景顏色),卻忽略了文字的背景顏色。code
修改文字背景顏色使用 SetBkColor 函數,它的原型爲:blog
COLORREF SetBkColor( HDC hdc, //設備環境句柄 COLORREF crColor //背景顏色 );
修改文字前景色(文字顏色)使用 SetTextColor 函數,它的原型爲:原型
COLORREF SetTextColor( HDC hdc, //設備環境句柄 COLORREF crColor //背景顏色 );
這裏咱們修改的是 static 控件中的文本顏色,因此須要獲取 static 控件的設備環境句柄。很是巧妙的是,發送 WM_CTLCOLORSTATIC 消息時,wParam 參數表示的就是 static 控件的設備環境句柄(lParam 表示控件句柄)。it
下面的代碼會修改文本的背景色和前景色:class
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ PAINTSTRUCT ps; HDC hdcWnd; HDC hdcStatic; static HFONT hFont; //邏輯字體 static HWND hStatic; //靜態文本框控件 static HBRUSH hBrush; //畫刷 switch (message){ case WM_CREATE: //建立畫刷 hBrush = CreateSolidBrush( RGB(0x41, 0x96, 0x4F) ); //建立邏輯字體 hFont = CreateFont(-14/*高*/, -7/*寬*/, 0, 0, 700 /*700表示粗體*/, FALSE/*斜體?*/, FALSE/*下劃線?*/, FALSE/*刪除線?*/,DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, TEXT("微軟雅黑") ); //建立靜態文本框控件 hStatic = CreateWindow(TEXT("static"), TEXT("歡迎來到C語言中文網!"), WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE | SS_CENTER, 20 /*x座標*/, 20 /*y座標*/, 240 /*寬度*/, 60 /*高度*/, hWnd /*父窗口句柄*/, (HMENU)1 /*控件ID*/, hInst /*當前程序實例句柄*/, NULL ); //設置控件的字體 SendMessage(hStatic, WM_SETFONT, (WPARAM)hFont, NULL); break; case WM_CTLCOLORSTATIC: hdcStatic = (HDC)wParam; SetTextColor( hdcStatic, RGB(255, 255, 255) ); //白色 SetBkColor( hdcStatic, RGB(0x41, 0x96, 0x4F) ); //翠綠色 return (INT_PTR)hBrush; case WM_PAINT: hdcWnd = BeginPaint(hWnd, &ps); // TODO: 在此添加任意繪圖代碼... EndPaint(hWnd, &ps); break; case WM_DESTROY: DeleteObject(hBrush); DeleteObject(hFont); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
運行結果:程序
因此要想達到修改背景顏色的目的,除了修改static 控件的背景顏色,還要修改文本的背景顏色。
透明背景
實現透明背景須要設置文本背景顏色透明,同時返回沒有顏色的畫刷。
1) SetBkMode 函數能夠用來設置文本的背景模式,它的原型爲:
int SetBkMode( HDC hdc, //設備環境句柄 int iBkMode //背景模式 );
iBkMode 有下面兩種取值:
取值 說明
OPAQUE 使用當前背景顏色來填充背景。
TRANSPARENT 背景透明。
2) GetStockObject (NULL_BRUSH); 語句能夠返回沒有顏色的畫刷。
示例代碼:
複製純文本新窗口
case WM_CTLCOLORSTATIC: hdcStatic = (HDC)wParam; SetTextColor( hdcStatic, RGB(0x41, 0x96, 0x4F) ); //翠綠色 SetBkMode(hdcStatic, TRANSPARENT); //透明背景 return (INT_PTR)GetStockObject(NULL_BRUSH); //無顏色畫刷
運行效果: