当前位置: 首页 > article >正文

Windows控制台函数:设置文字颜色样式函数SetConsoleTextAttribute()

目录

什么是 SetConsoleTextAttribute?

函数签名

参数详解

常见的颜色值

怎么用它?

再试一个多彩的例子

为什么要恢复默认颜色?

跟其他函数的关系

注意事项

什么是 SetConsoleTextAttribute?

SetConsoleTextAttribute 是一个 Windows API 函数,用来设置控制台文字的颜色和样式。它就像一个“调色盘”,可以改变你输出到屏幕上的文字颜色(比如红色、蓝色)或者背景颜色。

想象你在黑板上写字,默认是白色粉笔,但用这个函数,你可以换成彩色粉笔,还能给文字加个彩色背景。

函数签名

SetConsoleTextAttribute 的全称是 "Set Console Text Attribute",可以拆解成以下部分来理解:

  • Set:表示设置(更改某个属性或状态)。

  • Console:指的是控制台(Console),即 Windows 终端窗口。

  • Text:指的是文本,即显示在控制台上的字符。

  • Attribute:指的是属性,在这里主要指的是文本的颜色和背景颜色

它的定义是:

BOOL SetConsoleTextAttribute(
    HANDLE hConsoleOutput, // 屏幕的“钥匙”
    WORD wAttributes       // 颜色和样式的“调色盘”
);
  • HANDLE hConsoleOutput: 你用 GetStdHandle(STD_OUTPUT_HANDLE) 拿到的屏幕句柄。

  • WORD wAttributes: 一个数字,代表文字和背景的颜色组合。

  • 返回值是 BOOL:TRUE 表示成功,FALSE 表示失败。

参数详解

1. HANDLE hConsoleOutput - 屏幕的“钥匙”

  • 这是什么:跟 WriteConsoleA 一样,是屏幕的句柄。

  • 作用:告诉函数:“我要调整屏幕上文字的颜色。”

  • 怎么用:

HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);

2. WORD wAttributes - 颜色和样式的“调色盘”

  • 这是什么:一个 16 位整数(WORD),用来指定前景色(文字颜色)和背景色。

  • 作用:决定文字是什么颜色,背景是什么颜色。

  • 怎么用:用一些预定义的颜色值组合起来。

常见的颜色值

这些值是 Windows 定义好的,你可以直接用:

  • 前景色(文字颜色):

    • FOREGROUND_BLUE (1):蓝色

    • FOREGROUND_GREEN (2):绿色

    • FOREGROUND_RED (4):红色

    • FOREGROUND_INTENSITY (8):加亮(使颜色更鲜艳)

  • 背景色:

    • BACKGROUND_BLUE (16):蓝色背景

    • BACKGROUND_GREEN (32):绿色背景

    • BACKGROUND_RED (64):红色背景

    • BACKGROUND_INTENSITY (128):背景加亮

组合颜色

可以用 |(按位或)把颜色加在一起:

  • 红字绿底:FOREGROUND_RED | BACKGROUND_GREEN(4 | 32 = 36)

  • 亮蓝字黑底:FOREGROUND_BLUE | FOREGROUND_INTENSITY(1 | 8 = 9)

怎么用它?

我们写个例子,把文字变成红色:

#include <windows.h>
#include <cstring>

int main() {
    // 1. 拿到屏幕钥匙
    HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);
    if (screen == INVALID_HANDLE_VALUE) {
        return 1;
    }

    // 2. 设置文字为红色
    SetConsoleTextAttribute(screen, FOREGROUND_RED);

    // 3. 输出文字
    const char* message = "我是红色的!";
    DWORD written;
    WriteConsoleA(screen, message, strlen(message), &written, NULL);

    return 0;
}

运行过程:

  1. 拿到钥匙:GetStdHandle(STD_OUTPUT_HANDLE) 给你屏幕句柄。

  2. 调颜色:SetConsoleTextAttribute 把文字颜色设为红色(FOREGROUND_RED 是 4)。

  3. 写文字:WriteConsoleA 输出“我是红色的!”,显示为红色。

运行结果:屏幕上显示红色的“我是红色的!”。

再试一个多彩的例子

我们输出几种不同颜色的文字:

#include <windows.h>
#include <cstring>

int main() {
    HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);
    if (screen == INVALID_HANDLE_VALUE) {
        return 1;
    }

    DWORD written;

    // 红字
    SetConsoleTextAttribute(screen, FOREGROUND_RED);
    const char* msg1 = "红色的字\n";
    WriteConsoleA(screen, msg1, strlen(msg1), &written, NULL);

    // 亮蓝字
    SetConsoleTextAttribute(screen, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
    const char* msg2 = "亮蓝色的字\n";
    WriteConsoleA(screen, msg2, strlen(msg2), &written, NULL);

    // 绿字红底
    SetConsoleTextAttribute(screen, FOREGROUND_GREEN | BACKGROUND_RED);
    const char* msg3 = "绿字红底\n";
    WriteConsoleA(screen, msg3, strlen(msg3), &written, NULL);

    // 恢复默认(白字黑底)
    SetConsoleTextAttribute(screen, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    const char* msg4 = "回到默认颜色\n";
    WriteConsoleA(screen, msg4, strlen(msg4), &written, NULL);

    return 0;
}

运行结果:

  1. “红色的字” 是红色。

  2. “亮蓝色的字” 是亮蓝色。

  3. “绿字红底” 是绿色文字、红色背景。

  4. “回到默认颜色” 是白色文字、黑色背景(默认样式)。

为什么要恢复默认颜色?

  • SetConsoleTextAttribute 设置的颜色会一直生效,直到你再次改变它。

  • 如果不恢复默认,后面所有输出都会用最后一次设置的颜色。

  • 默认颜色是白字黑底,用 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE(4 | 2 | 1 = 7)表示。

跟其他函数的关系

  • 搭配 WriteConsoleA:先用 SetConsoleTextAttribute 调颜色,再用 WriteConsoleA 输出。

  • 跟 SetConsoleCursorPosition 一起用:可以控制颜色和位置,做出彩色的布局。

注意事项

  1. 颜色范围:

    • 只有 16 种基本颜色(通过组合红、绿、蓝)。

    • 加 INTENSITY 可以变亮,但没法调出所有颜色。

  2. 中文支持:

         如果显示乱码,可能需要设置 UTF-8 代码页:

system("mode con cp=65001");

    3.检查返回值 

if (!SetConsoleTextAttribute(screen, FOREGROUND_RED)) {
    return 1; // 出错了
}

http://www.kler.cn/a/580854.html

相关文章:

  • SQL 窗口函数之lead() over(partition by ) 和 lag() over(partition by )
  • 批量将 Excel 转换 PDF/Word/CSV以及图片等其它格式
  • 手写Tomcat
  • C++ 内存模型
  • 从头开始开发基于虹软SDK的人脸识别考勤系统(python+RTSP开源)(三)
  • 1688商品列表商品详情API接口全面解析
  • upload-labs详解(13-20)文件上传分析
  • 大湾区经济网战略媒体澳门《红刊》访霍英东集团
  • 转自南京日报:天洑软件创新AI+仿真技术变制造为“智造
  • 从C#中的MemberwiseClone()浅拷贝说起
  • CentOS7离线部署安装Dify
  • 网络安全技术整体架构 一个中心三重防护
  • 基于架构的软件开发(ABSD)
  • 3D模型语义搜索引擎
  • 聚水潭数据集成到MySQL的高效方法
  • 51c视觉~3D~合集2
  • 笔记本电脑外接固态移动硬盘可以用于深度学习吗
  • Cryptography 与 PyCryptodome 源码级解析
  • MCP-代码解读TypeScript版本
  • (二分 数学推导区间 两个数组的距离值)leetcode 1385