日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】修改static控件背景颜色和文字颜色

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】修改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控件背景颜色和文字颜色的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。