最近,我试图用下划线在C中打印文本。我的控制台不支持ANSI转义字符,因此我尝试使用控制台支持的DBCS。为此,我必须更改控制台文本属性。最初,我使用SetConsoleTextAttribute
进行更改,但后来我想记住颜色并仅更改下划线时,我开始使用GetConsoleScreenBufferInfoEx
和SetConsoleScreenBufferInfoEx
来获取以前的属性。从那时起,我注意到使用前者时,它只会影响调用后打印的文本,对于后者,我还更改了前者的属性。
例如,我编写了2个短代码并将其编译。
代码1:
#include <Windows.h>
#include <stdio.h>
int main()
{
printf("Code 1:\n");
HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD mode = 0;
int flag = 1;
flag &= GetConsoleMode(out, &mode);
flag &= SetConsoleMode(out, mode | ENABLE_LVB_GRID_WORLDWIDE);
//7 is the default foreground - gray
SetConsoleTextAttribute(out, 7 | COMMON_LVB_UNDERSCORE);
printf("Hello World! 1==%d", flag);
getchar();
SetConsoleTextAttribute(out, 7);
printf("Goodbye World! 1==%d", flag);
getchar();
return 0;
}
和代码2:
#include <Windows.h>
#include <stdio.h>
typedef CONSOLE_SCREEN_BUFFER_INFOEX CSBI;
int main()
{
printf("Code 2:\n");
HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD mode = 0;
int flag = 1;
flag &= GetConsoleMode(out, &mode);
flag &= SetConsoleMode(out, mode | ENABLE_LVB_GRID_WORLDWIDE);
CSBI csbi = { 0 };
csbi.cbSize = sizeof(csbi);
flag &= GetConsoleScreenBufferInfoEx(out, &csbi);
csbi.wAttributes |= COMMON_LVB_UNDERSCORE;
flag &= SetConsoleScreenBufferInfoEx(out, &csbi);
printf("Hello World! 1==%d", flag);
getchar();
csbi.wAttributes &= ~COMMON_LVB_UNDERSCORE;
flag &= SetConsoleScreenBufferInfoEx(out, &csbi);
printf("Goodbye World! 1==%d", flag);
getchar();
return 0;
}
标志是确保所有函数都返回TRUE
在第一个代码中,“代码1”将保持不带下划线“ Hello World!”。将带有下划线和“再见世界!”没有下划线。
在第二个代码中,所有内容都会带有下划线,直到我输入新行,然后所有内容都将失去下划线。
有谁知道为什么会这样吗?尽管我将对控制台文本属性做同样的事情。
谢谢罗伊
最佳答案
在第二个代码中,所有内容都会带有下划线,直到我输入新行,然后所有内容都将失去下划线。
经过我的测试,这两段代码的最终效果是相同的。
有谁知道为什么会这样吗?尽管我将对控制台文本属性做同样的事情。
SetConsoleTextAttribute:设置写入字符的属性
通过WriteFile或WriteConsole函数创建控制台屏幕缓冲区,
或由ReadFile或ReadConsole函数回显。这个功能
影响函数调用后编写的文本。
SetConsoleScreenBufferInfoEx:设置有关
指定的控制台屏幕缓冲区。
对于注释,在控制台文本的属性上,SetConsoleTextAttribute
和SetConsoleScreenBufferInfoEx
可以达到相同的效果,例如changing the color of the text或添加下划线。
关于c - SetConsoleScreenBufferInfoEx的工作方式不同于SetConsoleTextAttribute,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58567021/