gpt4 book ai didi

c - SetConsoleScreenBufferInfoEx 的工作方式与 SetConsoleTextAttribute 不同

转载 作者:行者123 更新时间:2023-11-30 16:11:38 25 4
gpt4 key购买 nike

最近我尝试用 C 语言打印带下划线的文本。我的控制台不支持 ANSI 转义字符,因此我尝试使用 DBCS,我的控制台支持该字符。为此,我必须更改控制台文本属性。一开始我使用 SetConsoleTextAttribute 来更改它,但后来当我想记住颜色并且只更改下划线时,我开始使用 GetConsoleScreenBufferInfoExSetConsoleScreenBufferInfoEx还可以获取之前的属性。这时我注意到,当我使用前者时,它只会影响我在调用后打印的文本,而在后者的情况下,我还会更改前一个文本的属性。

例如,我编写了两个简短的代码并编译了它们。

代码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

在第一个代码中,“Code 1”将保留,不带下划线,“Hello World!”将有下划线和“再见世界!”不会有下划线。

在第二个代码中,所有内容都会有下划线,直到我输入新行,然后所有内容都会失去下划线。

有谁知道为什么会这样吗?我认为他们会对控制台文本属性做同样的事情。

谢谢,罗伊

最佳答案

在第二个代码中,所有内容都会有下划线,直到我输入新行,然后所有内容都会失去下划线。

经过我的测试,两段代码最终的效果是一样的。

enter image description here

有人知道为什么会这样吗?我认为他们会对控制台文本属性做同样的事情。

SetConsoleTextAttribute: Sets the attributes of characters written to the console screen buffer by the WriteFile or WriteConsole function, or echoed by the ReadFile or ReadConsole function. This function affects text written after the function call.

SetConsoleScreenBufferInfoEx: Sets extended information about the specified console screen buffer.

对于注释,在控制台文本的属性上,SetConsoleTextAttributeSetConsoleScreenBufferInfoEx可以达到同样的效果,如changing the color of the text或添加下划线。

关于c - SetConsoleScreenBufferInfoEx 的工作方式与 SetConsoleTextAttribute 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58567021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com