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

2023-11-11

一、设置控件背景颜色

当 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);  //无颜色画刷
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Exit() 时是否调用基本对象析构函数?

    我意识到这个问题已经出现过几次 但我试图获得上述问题的明确答案 但我不断遇到相互矛盾的信息 我需要知道的是 当我使用 exit 时 基本类对象是否被破坏 我知道需要删除动态内存 但我的意思更像是 include
  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 按扩展名过滤搜索文件返回太多结果

    我正在开发一个 C 控制台应用程序 它必须管理 Windows 操作系统上的文件 我需要获取具有特定扩展名的文件名 列表 我找到了很多解决方案 最建议的是以下一种 HANDLE hFind WIN32 FIND DATA data hFin
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 无法将字符串文字分配给装箱的 std::string 向量

    这是我的类型系统的简化版本 include
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • Python打乱数据集

    在随机划分训练集和测试集时 需要随机划分 使用这种方法 一 打乱索引 import random random seed seed index i for i in range len x train random shuffle inde
  • linux定时删除指定文件shell脚本

    vi delete sh 输入以下内容 bin bash data path home test logs expire time 1 function deletefiles for file in find 1 name Default
  • vscode安装node-snippets

    vscode安装node snippets扩展后没有代码提示问题 安装好扩展后 输入node后仍没有代码提示 需要观察自己的代码所在文件路径是否全是英文路径 然后大多都以了 如果还有不行 就尝试在设置里面输入prevent 取消下面的选中
  • windows下如何安装高版本的jaxlib

    https zhuanlan zhihu com p 498404068
  • Vue2手捏Vuex插件

    一 展示数据 state 1 plugins Vuex js let Vue class Store constructor options 1 保存数据 通过 vue 中的 data 是响应式 this vm new Vue data s
  • C语言百日刷题第九天

    前言 今天是刷题第9天 放弃不难 但坚持一定很酷 快来跟我一起刷题吧 加油 一起努力进步 C语言百日刷题第九天 前言 76 计算偶数的所有质因子 77 提取不重复的整数 78 二进制中1的个数 79 猴子分桃 80 百钱买百鸡 76 计算偶
  • Typora-Markdown 文本编辑器

    图片 md test png img src md test png height 300 时序图 实线 gt gt gt 虚线 gt gt gt 背景 rect rgb 244 244 255 end 列子 mermaid sequenc
  • SSM商城项目实战:客户管理

    SSM商城项目实战 客户管理 1 项目背景和需求分析 在一个电商平台中 客户管理是非常重要的一环 通过对客户信息的管理 可以更好地了解客户需求 提供个性化的服务 增强客户满意度 本项目旨在实现一个简单的客户管理功能 包括客户信息的添加 修改
  • react组件权限控制+路由权限+路由懒加载

    组件控制 permission js import React useEffect useState useContext from react const PermissionContext React createContext per
  • [~/vulhub]/log4j/CVE-2021-44228-20221225

    vulhub log4j CVE 2021 44228 kwkl kwkl vulhub cd log4j CVE 2021 44228 kwkl kwkl vulhub log4j CVE 2021 44228
  • flutter 对象模型的理解

    如果要传值 传一个int值时就很简单了 类型就是int 如果我们要传好多个值呢 里面有int 也有String 也会有列表 对象 当然我们也可以一个个传 问题是这样子很麻烦 我们可以将这些不同的类型数据堆到一个模型里面 然后传这个模型 也就
  • 为了搞清楚CDN的原理,我头都秃了...

    点击上方 前端Q 关注公众号 回复加群 加入前端Q技术交流群 作者 winty的帆宝宝 原文地址 https juejin cn post 6944420222757503006 今天下班前忽然发现维护的项目网站打不开了 打开控制台一看 原
  • C++--运算符

    运算符是一种告诉编译器执行特定的数学或逻辑操作的符号 C 内置了丰富的运算符 并提供了以下类型的运算符 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 本章将逐一介绍算术运算符 关系运算符 逻辑运算符 位运算符 赋值运
  • Python的turtle库(教师节祝福,用turtle画一只熊猫和一个太阳)

    目录 一 基本功能 1 turtle库的官方文档 2 开始绘制 3 绘制结果 4 常用的turtle库的方法 一 基本功能 1 turtle库的官方文档 官方文档 2 开始绘制 import turtle as t import math
  • Async详解之一:流程控制

    转载 http freewind me blog 20120515 917 html 为了适应异步编程 减少回调的嵌套 我尝试了很多库 最终觉得还是async最靠谱 地址 https github com caolan async Asyn
  • numpy数据处理

    介绍了获取 设置 调整 NumPy 数组数值的方法与工具 包括取值操作 如arr 2 1 切片操作 如 arr 1 5 掩码操作 如 arr arr gt 0 花哨的索引操作 如 arr 0 1 5 以及组合操作 如 arr 1 5 imp
  • Echarts详解之饼状图展示

    使用背景 要求展示吃喝玩乐状态 自己查阅了一些资料 现将完整步骤贴在下面 供宝子们参考 前言 先引入echarts文件 一 实现效果 二 html代码 三 JS代码 四 Css样式
  • Maven Exception in thread “main“ java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.g

    package 0605 import org apache spark rdd RDD import org apache spark sql DataFrame Row SparkSession import org apache sp
  • SELECT 下拉框 重复点击选项 change事件无法再次触发的问题

    原版本 无法重复触发change事件
  • 十、C语言创建桌面程序:背景颜色和文字颜色

    一 设置控件背景颜色 当 static 控件或具有 ES READONLY 风格的 edit 控件被绘制时 会向父窗口发送 WM CTLCOLORSTATIC 消息 如果我们在窗口过程中处理该消息 就必须返回一个画刷句柄 Windows 会