C语言SetConsoleText如何改变控制台文本颜色?

99ANYc3cd6
预计阅读时长 21 分钟
位置: 首页 C语言 正文

请注意,您提到的 setconsoletext 可能是一个小小的笔误,在Windows API中,这个函数的正确名称是 SetConsoleTextAttribute,它的作用是设置控制台屏幕缓冲区中后续文本的字符属性,最主要的应用就是改变文本的颜色和背景色。

c语言setconsoletext
(图片来源网络,侵删)

函数简介

SetConsoleTextAttribute 是 Windows API 中的一个函数,它位于 windows.h 头文件中,这个函数仅适用于 Windows 操作系统,在 Linux 或 macOS 的标准终端中无法使用。

函数原型:

BOOL SetConsoleTextAttribute(
  [in] HANDLE hConsoleOutput,
  [in] WORD   wAttributes
);

参数说明:

  1. hConsoleOutput (输入): 一个 HANDLE (句柄),代表要修改的控制台屏幕缓冲区,我们使用 GetStdHandle 函数来获取标准输出(屏幕)的句柄。

    c语言setconsoletext
    (图片来源网络,侵删)
    • STD_OUTPUT_HANDLE: 标准输出设备的句柄,就是我们通常看到的控制台窗口。
  2. wAttributes (输入): 一个 WORD 类型的值(16位无符号整数),它是一个位掩码,组合了文本颜色和背景颜色,你可以使用预定义的宏来进行组合。

返回值:

  • 如果成功,返回 TRUE (非零)。
  • 如果失败,返回 FALSE (零),你可以调用 GetLastError 函数获取详细的错误信息。

颜色属性

颜色是通过组合不同的宏来定义的,这些宏通常在 windows.h 中定义。

文本颜色 (Foreground Colors)

这些宏需要与 FOREGROUND_ 前缀一起使用,或者直接使用它们的十六进制值。

c语言setconsoletext
(图片来源网络,侵删)
值 (十六进制) 描述
FOREGROUND_RED 0x0004 红色
FOREGROUND_GREEN 0x0002 绿色
FOREGROUND_BLUE 0x0001 蓝色
FOREGROUND_INTENSITY 0x0008 亮度(加粗/高亮)
FOREGROUND_WHITE 0x0007 (红色+绿色+蓝色) 白色

背景颜色 (Background Colors)

这些宏需要与 BACKGROUND_ 前缀一起使用。

值 (十六进制) 描述
BACKGROUND_RED 0x0040 红色
BACKGROUND_GREEN 0x0020 绿色
BACKGROUND_BLUE 0x0010 蓝色
BACKGROUND_INTENSITY 0x0080 亮度(更亮的背景)
BACKGROUND_WHITE 0x0070 (红色+绿色+蓝色) 白色

常用组合

在实际使用中,我们通常使用 (按位或) 运算符将前景色和背景色组合起来。

组合值 预定义宏 (如果存在) 描述
FOREGROUND_RED \| BACKGROUND_GREEN - 红字绿底
FOREGROUND_GREEN \| BACKGROUND_BLUE - 绿字蓝底
FOREGROUND_BLUE \| BACKGROUND_INTENSITY - 蓝字亮底
FOREGROUND_WHITE \| BACKGROUND_RED - 白字红底
FOREGROUND_RED \| FOREGROUND_GREEN \| FOREGROUND_BLUE FOREGROUND_WHITE 白字黑底(默认)
FOREGROUND_RED \| FOREGROUND_GREEN \| FOREGROUND_BLUE \| FOREGROUND_INTENSITY FOREGROUND_WHITE \| FOREGROUND_INTENSITY 亮白字黑底(加粗)

完整示例代码

下面是一个完整的C语言示例,它会演示如何输出不同颜色和背景的文本。

#include <stdio.h>
#include <windows.h> // 必须包含此头文件
// 为了方便,定义一些颜色组合
#define COLOR_RED      (FOREGROUND_RED | FOREGROUND_INTENSITY)
#define COLOR_GREEN    (FOREGROUND_GREEN | FOREGROUND_INTENSITY)
#define COLOR_BLUE     (FOREGROUND_BLUE | FOREGROUND_INTENSITY)
#define COLOR_YELLOW   (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY)
#define COLOR_CYAN     (FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY)
#define COLOR_MAGENTA  (FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY)
#define COLOR_WHITE    (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY)
// 背景色需要单独设置
#define BG_RED        (BACKGROUND_RED)
#define BG_GREEN      (BACKGROUND_GREEN)
#define BG_BLUE       (BACKGROUND_BLUE)
#define BG_WHITE      (BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE)
int main() {
    // 1. 获取标准输出设备的句柄
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hConsole == INVALID_HANDLE_VALUE) {
        printf("无法获取控制台句柄,\n");
        return 1;
    }
    // 2. 设置并输出不同颜色的文本
    // 注意:SetConsoleTextAttribute 会影响之后所有的输出,直到再次被修改。
    // 红色文本
    SetConsoleTextAttribute(hConsole, COLOR_RED);
    printf("这是红色文本,\n");
    // 绿色文本
    SetConsoleTextAttribute(hConsole, COLOR_GREEN);
    printf("这是绿色文本,\n");
    // 蓝色文本
    SetConsoleTextAttribute(hConsole, COLOR_BLUE);
    printf("这是蓝色文本,\n");
    // 黄色文本 (红+绿)
    SetConsoleTextAttribute(hConsole, COLOR_YELLOW);
    printf("这是黄色文本,\n");
    // 白色文本
    SetConsoleTextAttribute(hConsole, COLOR_WHITE);
    printf("这是白色文本,\n");
    // 3. 设置带背景色的文本
    // 红字绿底
    SetConsoleTextAttribute(hConsole, COLOR_RED | BG_GREEN);
    printf("这是红字绿底的文本,\n");
    // 蓝字白底
    SetConsoleTextAttribute(hConsole, COLOR_BLUE | BG_WHITE);
    printf("这是蓝字白底的文本,\n");
    // 4. 恢复默认颜色 (黑底白字)
    // 默认颜色是 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE (白色文本)
    // 背景色默认是黑色 (无背景色宏)
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    printf("\n程序结束,已恢复默认颜色,\n");
    // 等待用户按键,以便看清输出效果
    system("pause");
    return 0;
}

如何编译和运行

  1. 将上述代码保存为 color_console.c
  2. 打开 Visual Studio 的开发者命令提示 (x64 Native Tools Command Prompt) 或 MinGW 的终端。
  3. 使用 gcc 进行编译:
    gcc color_console.c -o color_console.exe
  4. 运行生成的可执行文件:
    color_console.exe

你将会看到一个彩色的控制台输出窗口。


跨平台解决方案

由于 SetConsoleTextAttribute 是 Windows 特有的,如果你需要编写跨平台的彩色控制台程序,可以考虑使用第三方库。

最著名的是 ncurses 库。

  • ncurses: 它是一个用于创建基于文本的用户界面的库,在 Unix-like 系统(Linux, macOS)上是标准库,通过一些包装库,它也可以在 Windows 上工作。

使用 ncurses 的简单示例 (Linux/macOS):

#include <ncurses.h> // ncurses 头文件
int main() {
    // 初始化 ncurses 模式
    initscr();
    cbreak(); // 禁用行缓冲
    noecho(); // 不显示用户输入的字符
    // 设置颜色对 (需要先调用 start_color())
    start_color();
    init_pair(1, COLOR_RED, COLOR_BLACK);    // 颜色对1: 红字黑底
    init_pair(2, COLOR_GREEN, COLOR_WHITE);  // 颜色对2: 绿字白底
    // 使用颜色对1打印
    attron(COLOR_PAIR(1));
    printw("这是红色文本,\n");
    attroff(COLOR_PAIR(1));
    // 使用颜色对2打印
    attron(COLOR_PAIR(2));
    printw("这是绿色白底的文本,\n");
    attroff(COLOR_PAIR(2));
    // 刷新屏幕,显示所有内容
    refresh();
    // 等待按键
    getch();
    // 结束 ncurses 模式,恢复终端
    endwin();
    return 0;
}

编译 ncurses 程序 (Linux):

gcc my_ncurses_app.c -o my_ncurses_app -lncurses
方法 优点 缺点 适用平台
SetConsoleTextAttribute 简单直接,是Windows的一部分,无需额外安装。 仅限Windows,不具备跨平台性。 Windows
ncurses 跨平台功能强大,提供丰富的文本UI功能。 需要额外安装库,API比Windows的更复杂。 Linux, macOS, Windows (通过端口)

如果你的程序只在Windows上运行SetConsoleTextAttribute 是最简单、最直接的选择,如果你的程序需要跨平台ncurses 是更好的选择。

-- 展开阅读全文 --
头像
C语言expected前缺什么?
« 上一篇 2025-12-10
织梦 data not found
下一篇 » 2025-12-10

相关文章

取消
微信二维码
支付宝二维码

目录[+]