生活随笔
收集整理的這篇文章主要介紹了
                                
【转】修改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); //無顏色畫刷
運行效果:
                            總結
                            
                                以上是生活随笔為你收集整理的【转】修改static控件背景颜色和文字颜色的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。