SetConsoleScreenBufferInfoEx

SetConsoleScreenBufferInfoEx

最近,我试图用下划线在C中打印文本。我的控制台不支持ANSI转义字符,因此我尝试使用控制台支持的DBCS。为此,我必须更改控制台文本属性。最初,我使用SetConsoleTextAttribute进行更改,但后来我想记住颜色并仅更改下划线时,我开始使用GetConsoleScreenBufferInfoExSetConsoleScreenBufferInfoEx来获取以前的属性。从那时起,我注意到使用前者时,它只会影响调用后打印的文本,对于后者,我还更改了前者的属性。

例如,我编写了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!”。将带有下划线和“再见世界!”没有下划线。

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

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

谢谢罗伊

最佳答案

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

经过我的测试,这两段代码的最终效果是相同的。

c - SetConsoleScreenBufferInfoEx的工作方式不同于SetConsoleTextAttribute-LMLPHP

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


  SetConsoleTextAttribute:设置写入字符的属性
  通过WriteFile或WriteConsole函数创建控制台屏幕缓冲区,
  或由ReadFile或ReadConsole函数回显。这个功能
  影响函数调用后编写的文本。
  
  SetConsoleScreenBufferInfoEx:设置有关
  指定的控制台屏幕缓冲区。


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

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

10-13 03:40