C语言中setconsolecolor如何改变控制台文字颜色?

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

SetConsoleTextAttribute

这个函数并不是 C 语言的标准库函数,而是 Windows API (应用程序编程接口) 的一部分,它只能在 Windows 操作系统 上使用,如果你需要在 Linux 或 macOS 上实现类似功能,需要使用不同的方法(如 ANSI 转义码)。

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

函数原型

在使用之前,你需要在你的 C 代码中包含 windows.h 头文件。

#include <windows.h>
BOOL WINAPI SetConsoleTextAttribute(
  _In_ HANDLE hConsoleOutput,
  _In_ WORD   wAttributes
);

参数详解:

  1. hConsoleOutput (控制台输出句柄)

    • 这是一个 句柄,可以理解为 Windows 用来标识“控制台输出窗口”的 ID。
    • 你不能直接使用这个窗口的 ID,需要通过另一个 API 函数 GetStdHandle 来获取它。
    • 通常我们使用 STD_OUTPUT_HANDLE 这个预定义常量来获取标准输出(也就是你的控制台窗口)的句柄。
  2. wAttributes (颜色属性)

    • 这是一个 16位WORD 类型值(在 windows.h 中通常被定义为 unsigned short)。
    • 它的每一位都代表一个属性,但对于颜色控制,我们主要关心它的 低 4 位
    • 这 4 位分为两组:
      • 高 2 位 (第 3, 4 位): 代表背景颜色。
      • 低 2 位 (第 1, 2 位): 代表文本颜色。

颜色常量

Windows API 为我们预定义了表示颜色的宏,这些宏可以直接用在 wAttributes 参数中。

c语言 setconsolecolor
(图片来源网络,侵删)
颜色 宏定义 值 (十六进制) 值 (十进制) 二进制表示 (低4位)
黑色 0 0x0 0 0000
蓝色 FOREGROUND_BLUE 0x1 1 0001
绿色 FOREGROUND_GREEN 0x2 2 0010
青色 FOREGROUND_BLUE | FOREGROUND_GREEN 0x3 3 0011
红色 FOREGROUND_RED 0x4 4 0100
洋红色 FOREGROUND_RED | FOREGROUND_BLUE 0x5 5 0101
黄色 FOREGROUND_RED | FOREGROUND_GREEN 0x6 6 0110
白色 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE 0x7 7 0111
亮灰色 FOREGROUND_INTENSITY 0x8 8 1000
亮蓝色 FOREGROUND_BLUE | FOREGROUND_INTENSITY 0x9 9 1001
亮绿色 FOREGROUND_GREEN | FOREGROUND_INTENSITY 0xA 10 1010
亮青色 FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY 0xB 11 1011
亮红色 FOREGROUND_RED | FOREGROUND_INTENSITY 0xC 12 1100
亮洋红色 FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY 0xD 13 1101
亮黄色 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY 0xE 14 1110
亮白色 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY 0xF 15 1111

背景颜色 使用类似的宏,只是前缀是 BACKGROUND_

  • BACKGROUND_BLACK (0x0)
  • BACKGROUND_BLUE (0x10)
  • BACKGROUND_GREEN (0x20)
  • BACKGROUND_RED (0x40)
  • BACKGROUND_INTENSITY (0x80) 用于设置亮色背景

如何组合颜色

wAttributes 参数的值是通过 按位或 运算符 () 组合起来的。

公式: wAttributes = 文本颜色_常量 | 背景颜色_常量;

示例:

c语言 setconsolecolor
(图片来源网络,侵删)
  • 绿色文本,黑色背景: FOREGROUND_GREEN | BACKGROUND_BLACK (值为 0x2 | 0x0,即 0x2)
  • 红色文本,蓝色背景: FOREGROUND_RED | BACKGROUND_BLUE (值为 0x4 | 0x10,即 0x14)
  • 亮黄色文本,亮蓝色背景: FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE | BACKGROUND_INTENSITY (值为 0xE | 0x90,即 0x9E)

完整 C 语言代码示例

下面是一个完整的示例,它展示了如何设置不同的颜色并打印文本。

#include <stdio.h>
#include <windows.h> // 必须包含此头文件
// 定义一些颜色组合,方便使用
#define COLOR_RED_TEXT    (FOREGROUND_RED | FOREGROUND_INTENSITY)
#define COLOR_GREEN_TEXT  (FOREGROUND_GREEN | FOREGROUND_INTENSITY)
#define COLOR_BLUE_TEXT   (FOREGROUND_BLUE | FOREGROUND_INTENSITY)
#define COLOR_YELLOW_TEXT (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY)
#define COLOR_WHITE_TEXT  (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY)
#define COLOR_BLUE_BG     (BACKGROUND_BLUE | BACKGROUND_INTENSITY)
#define COLOR_BLACK_BG    (0)
void clearConsole() {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD coordScreen = { 0, 0 };
    DWORD cCharsWritten;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    DWORD dwConSize;
    // 获取控制台屏幕缓冲区信息
    if (!GetConsoleScreenBufferInfo(hConsole, &csbi)) {
        printf("GetConsoleScreenBufferInfo failed\n");
        return;
    }
    dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
    // 用空格填充整个缓冲区
    if (!FillConsoleOutputCharacter(hConsole, (TCHAR) ' ', dwConSize, coordScreen, &cCharsWritten)) {
        printf("FillConsoleOutputCharacter failed\n");
        return;
    }
    // 设置填充字符的属性
    if (!FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten)) {
        printf("FillConsoleOutputAttribute failed\n");
        return;
    }
    // 将光标移动到左上角
    SetConsoleCursorPosition(hConsole, coordScreen);
}
int main() {
    // 1. 获取标准输出设备的句柄
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hConsole == INVALID_HANDLE_VALUE) {
        printf("Error: Could not get console handle.\n");
        return 1;
    }
    // 2. 设置并打印不同颜色的文本
    // 红色文本,黑色背景
    SetConsoleTextAttribute(hConsole, COLOR_RED_TEXT | COLOR_BLACK_BG);
    printf("This is red text.\n");
    // 绿色文本,黑色背景
    SetConsoleTextAttribute(hConsole, COLOR_GREEN_TEXT | COLOR_BLACK_BG);
    printf("This is green text.\n");
    // 蓝色文本,黑色背景
    SetConsoleTextAttribute(hConsole, COLOR_BLUE_TEXT | COLOR_BLACK_BG);
    printf("This is blue text.\n");
    // 黄色文本,黑色背景
    SetConsoleTextAttribute(hConsole, COLOR_YELLOW_TEXT | COLOR_BLACK_BG);
    printf("This is yellow text.\n");
    // 白色文本,黑色背景
    SetConsoleTextAttribute(hConsole, COLOR_WHITE_TEXT | COLOR_BLACK_BG);
    printf("This is white text.\n");
    // 组合示例:红色文本,蓝色背景
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED | BACKGROUND_BLUE);
    printf("This is red text on a blue background.\n");
    // 3. (重要!)恢复默认颜色
    // �
-- 展开阅读全文 --
头像
织梦猫HTML5模板,高端网络服务如何实现?
« 上一篇 2025-11-28
{dede:global.cfg_dz/}是什么意思?
下一篇 » 2025-11-28

相关文章

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

目录[+]