十、C语言创建桌面程序:背景颜色和文字颜色

一、设置控件背景颜色

当 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);  //无颜色画刷
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书香水墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值