当 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); //无颜色画刷

运行效果:

修改static控件背景颜色和文字颜色的更多相关文章

  1. MFC解决Static控件背景透明时文本覆盖重影

    通过映射OnCtlColor消息,而后在该函数中使用pDC->SetBkMode(TRANSPARENT)使Static控件背景透明时会出现:文本覆盖重影的问题,当改变控件的文本就会发生新文本与 ...

  2. c#winform中如何修改ListView控件每个单元格的颜色

    ListView在View属性为Details的时候它呈现的方式和DataGirdView差不多,它的每一行都是一个ListViewItem,然而每个ListViewItem都有一个BackColor ...

  3. static 控件颜色修改

    在对话框上放一个StaticText控件后如果文字长度不能铺满控件的 rect,如下: 那么运行时会出现如下效果 通过MSG_WM_CTLCOLORSTATIC消息修改static控件背景色模式为透明 ...

  4. VC OnCtlColor函数来修改控件背景颜色

    CWnd::OnCtlColor afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor ); 返回值:OnCtlColor必须 ...

  5. win32 修改Edit控件文本颜色与背景色

    #define WM_CTLCOLORMSGBOX 0x0132 #define WM_CTLCOLOREDIT 0x0133 //编辑控件Edit #define WM_CTLCOLORLISTBO ...

  6. iOS开发——UI高级OC篇&自定义控件之调整按钮中子控件(图片和文字)的位置

    自定义控件之调整按钮中子控件(图片和文字)的位置 其实还有一种是在storyBoard中实现的,只需要设置对应空间的左右间距: 这里实现前面两种自定义的方式 一:imageRectForContent ...

  7. C#控件背景透明的几种解决方案

    已经很少做winform程序了,最新参与了一个小项目,遇到了控件背景透明的功能要求,特在此总结一下,供有需要的同行参考. 0.背景透明的概念和分类 背景透明是啥意思呢,就是背景透明.哈哈,废话了.其实 ...

  8. 绘制n边形:用两个以上的控件来控制矩形的颜色、大小、位置及空实心(程序代写)

    绘制n边形:用两个以上的控件来控制矩形的颜色.大小.位置及空实心.(n由键盘输入) package lzy.di9zhang; import java.awt.BorderLayout;import ...

  9. Winform中修改WebBrowser控件User-Agent的方法(已经测试成功)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

随机推荐

  1. oracle spm使用1

    oracle11g new feature SPM 有助于保持sql的语句特性,仅仅同意运行性能提高的运行计划. 它不同于stored outlines, spm在于稳定sql性能,而store ou ...

  2. linux centos7 安装常用软件java,node,mysql,Seafile

    linux centos7 安装常用软件java,node,mysql,Seafile 安装压缩解压缩软件 yum install -y unzip zip 安装git yum install -y ...

  3. 新拿到的app跑的时候出现问题

    连接器链接失败,是因为对应类build后的中间产物.o文件没有生成,对应架构下,用模拟器跑的,很可能是因为无法编译产出x86,或i386架构的中间产物,所以linker链接转换机器码时候找不到对应的中 ...

  4. jsp 中 jstl c:if等标签失效问题

    <c:if test="${page == 1}"> ${s.index+1} </c:if> <c:if test="${page > ...

  5. 微信小程序 新手入门教程

    因为工作需要,最近学习了一下微信小程序,在此分享一下大概的流程. 强烈建议大家先去看微信小程序简易教程:点我进入 起步: 安装微信web开发软件者工具,需要破解的同学可以网上找破解教程,很简单的,这里 ...

  6. 如何用redis做到限制,一个手机号,1分钟内最多发一条,一天内最多10条

    需要两个缓存 key名称 phone-busy,缓存1分钟 key名称 phone-send-count,缓存1天,每成功发送一条+1 发送的时候流程如下: 判断phone-busy是否存在,存在直接 ...

  7. LoadRunner检查点使用小结

    LR中检查点有两种:图片和文字. 常用检查点函数如下: 1)web_find()函数用于从 HTML 页中搜索指定的文本字符串: 2)web_reg_find()函数注册一个请求,以在下一个操作函数( ...

  8. java scoket客户端服务端发送消息

    客户端 public class User { public static void main(String[] args) { while (true) { try { Socket socket ...

  9. Java 远程调用之Hessian简例

    1. [代码]1.服务接口(Hello.java) package server; public interface Hello { String hello(String name);}2. [代码 ...

  10. WAS:节点不同步问题

    刀片服务器硬盘坏了,换了硬盘后,通过dmgr无法重启该节点上的server. 单机./starServer 后,服务虽然启动了,但后台一直提示如下: [-- ::: CST] RoleViewLead ...