c - SetConsoleScreenBufferInfoEx 的工作方式与 SetConsoleTextAttribute 不同
问题描述
最近我尝试用下划线在 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
达到同样的效果,比如改变文本的颜色或者加下划线。
推荐阅读
- angular - 在硬件后退按钮上检查是否存在任何模态并关闭模态
- java - Azure KeyVault:如何添加带有连字符的 Spring 属性作为机密
- laravel - 数据表返回未定义的偏移量,但它在我 dd() 时返回数据
- matplotlib - 在绘图上创建带标签的水平线
- go - 如何在gorm中迁移模型?
- python - 有没有办法从 QuerySet 中获取外键实例?
- android - BroadcastReceiver 未收到 SMS 消息
- flutter - Flutter SharedPreferences 数据限制
- javascript - TypeError:e 在 popper.min.js 中未定义?
- ruby - 如何在 IntelliJ IDEA 中的包上下文中调试不同目录中的 Ruby Gem