如何将SetConsoleTextAttribute函数参数值192分解为前景色和背景色
SetConsoleTextAttribute参数分解思路
1 先明确参数位分配规则
SetConsoleTextAttribute的第二个参数是16位的WORD类型,颜色控制使用低8位,位分配固定为:
- 位0~位3(低4位):控制前景色(文本颜色)
- 位4~位7(高4位):控制背景色
对应系统定义的颜色宏如下:
// 前景色相关(低4位) #define FOREGROUND_BLUE 0x0001 // 前景蓝色分量 #define FOREGROUND_GREEN 0x0002 // 前景绿色分量 #define FOREGROUND_RED 0x0004 // 前景红色分量 #define FOREGROUND_INTENSITY 0x0008 // 前景高亮增强 // 背景色相关(高4位) #define BACKGROUND_BLUE 0x0010 // 背景蓝色分量 #define BACKGROUND_GREEN 0x0020 // 背景绿色分量 #define BACKGROUND_RED 0x0040 // 背景红色分量 #define BACKGROUND_INTENSITY 0x0080 // 背景高亮增强
2 转换数值进制拆分对应位
你要分解的十进制数值192,转十六进制为0xC0,转8位二进制为1100 0000,拆分高低4位:
- 低4位:
0000→ 前景色总数值为0 - 高4位:
1100→ 背景色总数值为0xC(十进制12)
3 匹配对应颜色属性
- 前景色低4位为0,所有前景色位都未激活,对应黑色文本
- 背景色高4位
1100拆分后为0x80 | 0x40,对应两个宏:0x40= BACKGROUND_RED(背景红色分量激活)0x80= BACKGROUND_INTENSITY(背景高亮激活)
组合后对应亮红色背景
通用验证方法
可以写代码直接打印参数对应的激活位,直观确认颜色组合:
#include <windows.h> #include <stdio.h> int main(){ WORD attr = 192; printf("===== 前景色激活位 =====\n"); if(attr & FOREGROUND_BLUE) printf("- FOREGROUND_BLUE\n"); if(attr & FOREGROUND_GREEN) printf("- FOREGROUND_GREEN\n"); if(attr & FOREGROUND_RED) printf("- FOREGROUND_RED\n"); if(attr & FOREGROUND_INTENSITY) printf("- FOREGROUND_INTENSITY\n"); printf("\n===== 背景色激活位 =====\n"); if(attr & BACKGROUND_BLUE) printf("- BACKGROUND_BLUE\n"); if(attr & BACKGROUND_GREEN) printf("- BACKGROUND_GREEN\n"); if(attr & BACKGROUND_RED) printf("- BACKGROUND_RED\n"); if(attr & BACKGROUND_INTENSITY) printf("- BACKGROUND_INTENSITY\n"); return 0; }
内容的提问来源于stack exchange,提问作者JJJohn
相关产品推荐
相关产品推荐

