C语言textattr函数如何设置文本属性?

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

textattr 是一个非标准的、过时的函数,主要用于在DOS 环境(如 MS-DOS, Turbo C, Borland C++ 等)下的文本模式终端中设置文本属性,包括颜色和亮度。

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

重要提示:现代环境不适用

在今天的现代操作系统(如 Windows 10/11, macOS, Linux)中,textattr 函数是无法使用的,这些系统使用图形界面(GUI)或复杂的终端模拟器(如 Windows Terminal, macOS Terminal, xterm),它们有自己的方式来控制文本颜色和样式(通常是 ANSI 转义码)。

textattr 是学习计算机历史和 DOS 编程时遇到的一个函数,如果你正在学习现代 C 语言开发,请直接跳到文末的“现代替代方案”部分。


textattr 函数简介

textattr 函数定义在头文件 <conio.h> 中。conio.h (Console Input/Output) 是一个专用于 DOS 环境的控制台 I/O 头文件,在标准 C 库中并不存在。

函数原型:

c语言textattr
(图片来源网络,侵删)
void textattr(int attribute);

功能: 设置后续所有文本输出的显示属性,这个属性是一个组合值,它同时决定了:

  • 前景色:字符本身的颜色。
  • 背景色:字符所在位置背景的颜色。
  • 闪烁:字符是否闪烁。

属性值的构成

textattr 的参数 attribute 是一个 8 位的整数,其每一位都有特定的含义:

7 6 5 4 3 2 1 0
含义 闪烁 背景色 (高亮位) 背景色 前景色 (高亮位) 前景色
  • 位 0-3 (低4位): 前景色
  • 位 4-6: 背景色
  • 位 7: 闪烁标志
  • 位 3 和 位 6: 分别是前景色和背景色的高亮/加粗标志。

颜色常量

我们使用 <conio.h> 中定义的宏来组合颜色,而不是直接写数字。

颜色 值 (前景色) 值 (背景色)
黑色 BLACK (0) BLACK (0)
蓝色 BLUE (1) BLUE (16)
绿色 GREEN (2) GREEN (32)
青色 CYAN (3) CYAN (48)
红色 RED (4) RED (64)
洋红 MAGENTA (5) MAGENTA (80)
棕色 BROWN (6) BROWN (96)
浅灰 LIGHTGRAY (7) LIGHTGRAY (112)

高亮/加亮颜色 (前景色): | 颜色 | 值 | | :--- | :--- | | 深灰 | DARKGRAY (8) | | 亮蓝 | LIGHTBLUE (9) | | 亮绿 | LIGHTGREEN (10) | | 亮青 | LIGHTCYAN (11) | | 亮红 | LIGHTRED (12) | | 亮洋红 | LIGHTMAGENTA (13) | | 黄色 | YELLOW (14) | | 白色 | WHITE (15) |

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

闪烁标志

要启用闪烁,需要将 BLINK (128) 与颜色值进行 按位或 (OR) 运算。


如何组合属性

组合属性的基本公式是: attribute = (背景色值) | (前景色值);

或者更具体地: attribute = (背景色 & 0x70) | (前景色 & 0x0F);

  • 前景色 & 0x0F 确保只使用前景色的低4位。
  • 背景色 & 0x70 确保只使用背景色的中间3位(第4,5,6位)。

示例:

  1. 绿色前景,黑色背景 GREEN 是 2,BLACK 是 0。 textattr(GREEN | BLACK); // 结果是 2

  2. 红色前景,蓝色背景 RED 是 4,BLUE 是 16。 textattr(RED | BLUE); // 结果是 20 (4 | 16 = 20)

  3. 白色前景,棕色背景,高亮显示 WHITE 是 15,BROWN 是 96。 textattr(WHITE | BROWN); // 结果是 111 (15 | 96 = 111)

  4. 黄色前景,黑色背景,闪烁 YELLOW 是 14,BLACK 是 0,BLINK 是 128。 textattr(YELLOW | BLACK | BLINK); // 结果是 142 (14 | 0 | 128 = 142)


完整的 DOS 示例代码

这个代码只能在支持 <conio.h> 的旧式编译器(如 Turbo C++ 3.0)上运行。

#include <stdio.h>
#include <conio.h> // 必须包含此头文件
int main() {
    // 1. 设置绿色前景,黑色背景
    textattr(GREEN);
    cprintf("This is green text on a black background.\n");
    // 2. 设置红色前景,蓝色背景
    textattr(RED | BLUE);
    cprintf("This is red text on a blue background.\n");
    // 3. 设置白色前景,棕色背景,并高亮
    textattr(WHITE | BROWN);
    cprintf("This is white text on a brown background (bright).\n");
    // 4. 设置黄色前景,黑色背景,并闪烁
    textattr(YELLOW | BLACK | BLINK);
    cprintf("This is yellow text on a black background (BLINKING!).\n");
    // 5. 恢复默认属性(通常是灰色前景,黑色背景)
    textattr(LIGHTGRAY | BLACK);
    cprintf("\nBack to default settings.\n");
    getch(); // 等待用户按一个键,防止窗口闪退
    return 0;
}

代码说明:

  • cprintf(): 是 conio.h 中的函数,类似于 printf,但直接输出到文本模式的控制台。
  • getch(): 也是 conio.h 中的函数,等待用户输入一个字符且不回显。

现代替代方案:ANSI 转义码

在 Windows, macOS 和 Linux 的现代终端中,我们使用 ANSI 转义码 来控制颜色和样式,这些是嵌入在字符串中的特殊字符序列。

基本格式: "\033[<代码>m"

  • \033 是转义字符(ASCII 码 27)。
  • [ 是开始标记。
  • <代码> 是具体的样式或颜色代码。
  • m 是结束标记。

颜色代码:

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

样式代码: | 样式 | 代码 | | :--- | :--- | | 重置所有样式 | 0 | | 高亮/加粗 | 1 | | 斜体 | 3 (支持度不一) | | 下划线 | 4 | | 闪烁 | 5 | | 反色(前景变背景,背景变前景)| 7 | | 隐藏 | 8 |

现代 C 语言示例:

这个代码可以在任何现代 C 编译器(如 GCC, Clang, MSVC)上运行,只要你在支持 ANSI 转义码的终端(如 Windows Terminal, VS Code 内置终端)中执行它。

#include <stdio.h>
int main() {
    // 1. 绿色前景,黑色背景
    printf("\033[32mThis is green text on a black background.\033[0m\n");
    // 2. 红色前景,蓝色背景
    printf("\033[31;44mThis is red text on a blue background.\033[0m\n");
    // 3. 白色前景,棕色背景,并高亮
    printf("\033[1;37;43mThis is white text on a brown background (bright).\033[0m\n");
    // 4. 黄色前景,黑色背景,并闪烁
    printf("\033[33;5mThis is yellow text on a black background (BLINKING!).\033[0m\n");
    // 5. 重置所有样式,确保后续输出正常
    printf("\nBack to default settings.\n");
    return 0;
}

代码说明:

  • \033[0m重置代码,非常重要!它会把终端的显示属性恢复到默认状态,避免影响后续的文本输出。
  • 代码可以组合,\033[1;31;44m 同时设置了高亮(1)、红色前景(31)和蓝色背景(44)。
特性 textattr (DOS) ANSI 转义码 (现代)
环境 DOS (过时) Windows, macOS, Linux (现代)
头文件 <conio.h> (非标准) 无需特殊头文件
方法 调用函数设置全局属性 在字符串中嵌入特殊序列
重置 textattr(LIGHTGRAY \| BLACK) \033[0m
适用性 仅用于学习或复古项目 所有现代终端应用开发

除非你有特殊的复古编程需求,否则请务必学习和使用 ANSI 转义码 来为你的现代 C 程序添加彩色输出。

-- 展开阅读全文 --
头像
dede如何提取文章中的图片?
« 上一篇 今天
织梦源码图片修改方法是什么?
下一篇 » 今天

相关文章

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

目录[+]