C语言如何设置窗口背景颜色?

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

C 语言本身并没有内置的函数可以直接设置控制台(终端)的背景颜色setbackcolor 这个函数并不是 C 语言标准库的一部分。

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

这个功能是由操作系统提供的,我们需要调用特定于操作系统的 API(应用程序编程接口)来实现,代码会因为你使用的操作系统(Windows, Linux, macOS)不同而有很大差异。

下面我将分别介绍在 WindowsLinux/macOS 两种主流操作系统上如何实现设置背景颜色。


在 Windows 系统中设置背景颜色

在 Windows 上,我们可以使用 Windows.h 头文件中提供的 SetConsoleTextAttribute 函数,这个函数可以同时设置控制台文本的颜色和背景颜色。

核心函数:SetConsoleTextAttribute

#include <windows.h>
BOOL SetConsoleTextAttribute(
  HANDLE hConsoleOutput,
  WORD   wAttributes
);
  • hConsoleOutput: 一个指向控制台屏幕缓冲区的句柄,通常使用 GetStdHandle(STD_OUTPUT_HANDLE) 来获取标准输出的句柄。
  • wAttributes: 一个 WORD 类型的值,它包含了文本颜色和背景颜色的信息,这个值是通过“或”运算 () 将前景色和背景色组合而成的。

颜色定义

颜色常量在 Windows.h 中定义如下:

c语言setbackcolor
(图片来源网络,侵删)
前景颜色 背景颜色
FOREGROUND_RED 0x0004 BACKGROUND_RED 0x0040
FOREGROUND_GREEN 0x0002 BACKGROUND_GREEN 0x0020
FOREGROUND_BLUE 0x0001 BACKGROUND_BLUE 0x0010
FOREGROUND_INTENSITY (高亮) 0x0008 BACKGROUND_INTENSITY (高亮) 0x0080
FOREGROUND_WHITE (红+绿+蓝) 0x0007 BACKGROUND_WHITE (红+绿+蓝) 0x0070

组合规则: 总属性 = 前景颜色 | 背景颜色

完整示例代码 (Windows)

#include <stdio.h>
#include <windows.h> // 包含 Windows API 头文件
// 定义一个函数来封装设置颜色的逻辑
void setConsoleColor(int foreground, int background) {
    // 获取标准输出句柄
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    // 组合前景色和背景色
    WORD color = (WORD)(foreground | background);
    // 设置控制台文本属性
    SetConsoleTextAttribute(hConsole, color);
}
int main() {
    // 1. 设置白色背景,黑色文字
    setConsoleColor(FOREGROUND_BLACK, BACKGROUND_WHITE);
    printf("这是白色背景,黑色文字,\n\n");
    // 2. 设置红色背景,绿色文字
    setConsoleColor(FOREGROUND_GREEN, BACKGROUND_RED);
    printf("这是红色背景,绿色文字,\n\n");
    // 3. 设置蓝色背景,黄色文字(黄色 = 红+绿)
    setConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN, BACKGROUND_BLUE);
    printf("这是蓝色背景,黄色文字,\n\n");
    // 4. 设置带高亮效果的洋红色背景,青色文字(青=绿+蓝)
    setConsoleColor(FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY, 
                    BACKGROUND_RED | BACKGROUND_BLUE);
    printf("这是高亮洋红色背景,高亮青色文字,\n\n");
    // 5. 恢复默认设置(通常是黑底白字)
    // 默认值是 0x07,即 FOREGROUND_WHITE (0x07) | BACKGROUND_BLACK (0x00)
    setConsoleColor(FOREGROUND_WHITE, BACKGROUND_BLACK);
    printf("已恢复默认设置,\n");
    return 0;
}

如何编译和运行 (Windows):

  1. 将代码保存为 color_win.c
  2. 打开 Visual Studio 的开发者命令提示符 或 MinGW 的终端。
  3. 使用 GCC 编译:gcc color_win.c -o color_win.exe
  4. 运行:color_win.exe
  5. 你会看到控制台的颜色发生了变化。

在 Linux 和 macOS 系统中设置背景颜色

在 Linux 和 macOS 等类 Unix 系统中,设置终端颜色的方式不同,我们通常通过输出特定的“转义序列”(Escape Sequences)到终端来控制其显示属性。

这些转义序列以 \033[ (或 \e[) 开头,以 m

核心转义序列

格式:\033[<样式>;<前景色>;<背景色>m

c语言setbackcolor
(图片来源网络,侵删)
  • \033[: 转义字符的开始。
  • m: 表示这是一个 SGR (Select Graphic Rendition) 命令的结束。

颜色代码

颜色 前景色代码 背景色代码
黑色 30 40
红色 31 41
绿色 32 42
黄色 33 43
蓝色 34 44
洋红色 35 45
青色 36 46
白色 37 47
高亮 1 1

组合规则: 用分号 分隔不同的代码,然后以 m

  • \033[31m:设置文字颜色为红色。
  • \033[44m:设置背景颜色为蓝色。
  • \033[1;33;44m:设置文字为高亮黄色,背景为蓝色。

重置所有属性 非常重要的一点是,改变的颜色会一直有效,直到你重置它,使用 \033[0m 可以将所有属性恢复到默认状态。

完整示例代码 (Linux/macOS)

#include <stdio.h>
// 定义一个函数来封装设置颜色的逻辑
void setConsoleColor(int foreground, int background, int highlight) {
    // printf 的 %c 可以用来打印单个字符
    // \033 是八进制表示法,等同于转义字符 '\e'
    printf("\033[%d;%d;%dm", highlight, foreground, background);
}
int main() {
    // 1. 设置白色背景,黑色文字
    setConsoleColor(30, 47, 0); // 黑色(30), 白色背景(47), 不高亮(0)
    printf("这是白色背景,黑色文字,\n\n");
    // 2. 设置红色背景,绿色文字
    setConsoleColor(32, 41, 0); // 绿色(32), 红色背景(41), 不高亮(0)
    printf("这是红色背景,绿色文字,\n\n");
    // 3. 设置蓝色背景,黄色文字
    setConsoleColor(33, 44, 0); // 黄色(33), 蓝色背景(44), 不高亮(0)
    printf("这是蓝色背景,黄色文字,\n\n");
    // 4. 设置带高亮效果的洋红色背景,青色文字
    setConsoleColor(36, 45, 1); // 青色(36), 洋红背景(45), 高亮(1)
    printf("这是高亮洋红色背景,高亮青色文字,\n\n");
    // 5. 恢复默认设置(黑底白字)
    printf("\033[0m"); // 输出重置序列
    printf("已恢复默认设置,\n");
    return 0;
}

如何编译和运行 (Linux/macOS):

  1. 将代码保存为 color_unix.c
  2. 打开终端。
  3. 使用 GCC 编译:gcc color_unix.c -o color_unix
  4. 运行:./color_unix
  5. 你会看到终端的颜色发生了变化。

跨平台解决方案

如果你想让你的 C 程序在不同操作系统上都能运行,你需要检测当前操作系统,然后调用相应的代码。

可以使用 #ifdef 预处理指令来实现。

跨平台示例代码

#include <stdio.h>
#ifdef _WIN32
    #include <windows.h>
    void setConsoleColor(int foreground, int background) {
        HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hConsole, (WORD)(foreground | background));
    }
#else
    // Linux, macOS, or other Unix-like systems
    void setConsoleColor(int foreground, int background, int highlight) {
        printf("\033[%d;%d;%dm", highlight, foreground, background);
    }
#endif
int main() {
    printf("跨平台颜色设置演示\n\n");
    #ifdef _WIN32
        setConsoleColor(FOREGROUND_RED, BACKGROUND_GREEN);
        printf("Windows: 红色文字,绿色背景,\n\n");
        setConsoleColor(FOREGROUND_WHITE, BACKGROUND_BLUE);
        printf("Windows: 白色文字,蓝色背景,\n\n");
        setConsoleColor(FOREGROUND_WHITE, BACKGROUND_BLACK); // 恢复
    #else
        setConsoleColor(31, 42, 0); // 红字,绿底
        printf("Unix-like: 红色文字,绿色背景,\n\n");
        setConsoleColor(37, 44, 0); // 白字,蓝底
        printf("Unix-like: 白色文字,蓝色背景,\n\n");
        printf("\033[0m"); // 恢复
    #endif
    printf("程序结束,\n");
    return 0;
}
特性 Windows (SetConsoleTextAttribute) Linux/macOS (ANSI Escape Sequences)
核心原理 调用系统 API 输出特殊的字符串序列
头文件 windows.h 无需特殊头文件
实现方式 SetConsoleTextAttribute(hConsole, color) printf("\033[<code>m");
颜色组合 通过 (或运算) 组合 通过 (分号) 组合
重置方式 再次调用设置默认色 \033[0m
可移植性 仅限 Windows 广泛支持现代终端

希望这个详细的解释能帮助你理解如何在 C 语言中设置背景颜色!

-- 展开阅读全文 --
头像
conversions c语言
« 上一篇 01-03
c语言stringlength
下一篇 » 01-03

相关文章

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