buaa21 / summer2020

软件学院《程序设计实践》2020小学期仓库
40 stars 8 forks source link

C++中color函数和SetConsoleTextAttribute的区别 #200

Closed lyj2209914083 closed 4 years ago

lyj2209914083 commented 4 years ago

我在代码的同一位置写SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE|FOREGROUND_RED)和system("color 0f")呈现的字体颜色结果是不一样的(不考虑背景色),请问这是什么情况?

PineZhuo commented 4 years ago

用color函数,控制台的颜色会被统一改变(如果使用多次,后面的会覆盖前面的,前面的不会保留),不能再出现其他颜色,而使用SetConsoleTextAttribute,则可以设置多种颜色,它只对函数位置之后的输出起作用

lyj2209914083 commented 4 years ago

用color函数,控制台的颜色会被统一改变(如果使用多次,后面的会覆盖前面的,前面的不会保留),不能再出现其他颜色,而使用SetConsoleTextAttribute,则可以设置多种颜色,它只对函数位置之后的输出起作用

那我先color的话,color之前的字体颜色也会变吗?还有我先用了SetConsoleTextAttribute,再用了color,再用了SetConsoleTextAttribute,此时的SetConsoleTextAttribute似乎没用了,显示的是color的颜色,这是为什么

PineZhuo commented 4 years ago

第一个问题,你自己实践一下不就知道了;第二个问题,system的原型是int system (const char* command);它会发出一个DOS命令,用于执行系统命令 而SetConsoleTextAttribute的原型是

BOOL SetConsoleTextAttribute(
HANDLE hConsoleOutput, // console 屏幕缓冲区的句柄
WORD wAttributes // 文本及背景的颜色
);

DOS命令是面向磁盘的操作命令,个人理解是DOS命令进行的是更底层的操作,从而使上层的SetConsoleTextAttribute函数无效。(我的OS学得一般,可以等一波其他助教的回答)