当 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(-/*高*/, -/*宽*/, , , /*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,
/*x坐标*/, /*y坐标*/, /*宽度*/, /*高度*/,
hWnd /*父窗口句柄*/, (HMENU) /*控件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();
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return ;
}

运行结果:

修改文字背景颜色
上图中,我们的代码只是改变了控件的背景颜色(整个子窗口的背景颜色),却忽略了文字的背景颜色。

修改文字背景颜色使用 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(-/*高*/, -/*宽*/, , , /*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,
/*x坐标*/, /*y坐标*/, /*宽度*/, /*高度*/,
hWnd /*父窗口句柄*/, (HMENU) /*控件ID*/, hInst /*当前程序实例句柄*/, NULL
);
//设置控件的字体
SendMessage(hStatic, WM_SETFONT, (WPARAM)hFont, NULL);
break;
case WM_CTLCOLORSTATIC:
hdcStatic = (HDC)wParam;
SetTextColor( hdcStatic, RGB(, , ) ); //白色
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();
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return ;
}

运行结果:


所以要想达到修改背景颜色的目的,除了修改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); //无颜色画刷

运行效果:

最新文章

  1. nw.js如何处理拖放操作
  2. hibernate----1-1-----两表关联属性放在另一个表里面
  3. bzoj3135: [Baltic2013]pipesd
  4. Python之MySql操作
  5. java基本数据类型存储范围
  6. [转] C++ Redistributable Package版本详解
  7. check_area
  8. checked
  9. 【CF】121 Div.1 C. Fools and Roads
  10. 光盘卡在MacBook里退不出来咋办?
  11. 根据控件Id得到控件
  12. Oracle笔记(六) 多表查询
  13. YII2 请求(request)
  14. mongodb的简明使用
  15. Python面向对象——基本继承
  16. JS学习笔记Day18
  17. python之UUID
  18. word之常用功能
  19. SpringCloud报错:Caused by: org.yaml.snakeyaml.parser.ParserException: while parsing MappingNode
  20. Tunnel Warfare(hdu1540 线段树)

热门文章

  1. 【iOS系列】-自定义Modar动画
  2. Delphi和C++的语法区别 (关于构造和析构)
  3. 尝试使用UISearchDisplayController及对苹果对控件封装习惯的理解
  4. BootStrap-DualListBox怎样改造成为双树
  5. Axure Base 07 元件使用思路的补充
  6. 为了cider,尝试emacs的坑
  7. MYSQL进阶学习笔记八:MySQL MyISAM的表锁!(视频序号:进阶_18-20)
  8. 简易五子棋 V1.1.0
  9. Servlet初始配置 监听器和过滤器
  10. 【CQOI2009】中位数图