
十、C语言创建桌面程序:背景颜色和文字颜色
发布日期:2021-05-07 20:56:34
浏览次数:24
分类:精选文章
本文共 4484 字,大约阅读时间需要 14 分钟。
一、设置控件背景颜色
当 static 控件或具有 ES_READONLY 风格的 edit 控件被绘制时,会向父窗口发送 WM_CTLCOLORSTATIC 消息。如果我们在窗口过程中处理该消息,就必须返回一个画刷句柄,Windows 会使用该画刷来绘制控件背景(子窗口背景)。
也就是说,改变 static 控件的背景颜色只有这一种方式,就是处理 WM_CTLCOLORSTATIC 消息。WM_CTLCOLORSTATIC 消息就是用来设置背景画刷的。
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("Hello World"), 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("Hello World"), 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;}
三、透明背景
实现透明背景需要设置文本背景颜色透明,同时返回没有颜色的画刷。
SetBkMode 函数可以用来设置文本的背景模式,它的原型为:
int SetBkMode( HDC hdc, //设备环境句柄 int iBkMode //背景模式,iBkMode 有下面两种取值:OPAQUE:;使用当前背景颜色来填充背景;TRANSPARENT;背景透明。);
GetStockObject (NULL_BRUSH); 语句可以返回没有颜色的画刷。
示例
case WM_CTLCOLORSTATIC: hdcStatic = (HDC)wParam; SetTextColor( hdcStatic, RGB(0x41, 0x96, 0x4F) ); //翠绿色 SetBkMode(hdcStatic, TRANSPARENT); //透明背景 return (INT_PTR)GetStockObject(NULL_BRUSH); //无颜色画刷
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月12日 20时50分24秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
环信SDK 踩坑记webIM篇(一)
2021-05-08
通信基础知识
2021-05-08
DSP开发板准备
2021-05-08
测试基本
2021-05-08
c++中istringstream及ostringstream超详细说明
2021-05-08
c++中ifstream及ofstream超详细说明
2021-05-08
c++中explicit和mutable关键字探究
2021-05-08
c语言结构体字节对齐详解
2021-05-08
linux c/c++面试知识点整理(八)
2021-05-08
linux网络编程系列(十二)--滑动窗口、拥塞控制、断线重连机制
2021-05-08
Deep residual learning for image recognition
2021-05-08
IO控制器
2021-05-08
LeetCode122.买卖股票的最佳时机2Golang版
2021-05-08
Java 知识点总结篇(2)
2021-05-08
Python 知识点总结篇(2)
2021-05-08
Python 知识点总结篇(3)
2021-05-08
爬取网易科技滚动新闻
2021-05-08
vuex modules
2021-05-08
Java笔记:单链表
2021-05-08