【发布时间】:2020-02-22 07:23:35
【问题描述】:
最近我尝试在 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!”将有下划线和“再见世界!”不会有下划线。
在第二个代码中,所有内容都会有下划线,直到我输入新行,然后所有内容都会失去下划线。
有人知道为什么会这样吗?我虽然他们会对控制台文本属性做同样的事情。
谢谢,罗伊
【问题讨论】:
-
不知道为什么您认为它们的行为相同。它们不是一回事,这就是它们都存在的原因。如果它们是相同的,其中之一将是完全多余的。