修改static控件背景顏色和文字顏色


當 static 控件或具有 ES_READONLY 風格的 edit 控件被繪制時,會向父窗口發送 WM_CTLCOLORSTATIC 消息。如果我們在窗口過程中處理該消息,就必須返回一個畫刷句柄,Windows 會使用該畫刷來繪制控件背景(子窗口背景)。

也就是說,改變 static 控件的背景顏色只有這一種方式,就是處理 WM_CTLCOLORSTATIC 消息。WM_CTLCOLORSTATIC 消息就是用來設置背景畫刷的。

改變 static 控件的背景顏色:

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;
}

運行結果:

修改文字背景顏色
上圖中,我們的代碼只是改變了控件的背景顏色(整個子窗口的背景顏色),卻忽略了文字的背景顏色。

修改文字背景顏色使用 SetBkColor 函數,它的原型為:

COLORREF SetBkColor(
HDC hdc, //設備環境句柄
COLORREF crColor //背景顏色
);

修改文字前景色(文字顏色)使用 SetTextColor 函數,它的原型為:

COLORREF SetTextColor(
HDC hdc, //設備環境句柄
COLORREF crColor //背景顏色
);

 

這里我們修改的是 static 控件中的文本顏色,所以需要獲取 static 控件的設備環境句柄。非常巧妙的是,發送 WM_CTLCOLORSTATIC 消息時,wParam 參數表示的就是 static 控件的設備環境句柄(lParam 表示控件句柄)。

下面的代碼會修改文本的背景色和前景色:

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); //無顏色畫刷

運行效果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM