首页 > 解决方案 > SetConsoleScreenBufferInfoEx 的工作方式与 SetConsoleTextAttribute 不同

问题描述

最近我尝试用下划线在 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!” 将有下划线和“再见世界!” 不会有下划线。

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

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

谢谢,罗伊

标签: cwinapiconsole

解决方案


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

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

在此处输入图像描述

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

SetConsoleTextAttribute:设置由 WriteFile 或 WriteConsole 函数写入控制台屏幕缓冲区,或由 ReadFile 或 ReadConsole 函数回显的字符的属性。此函数影响函数调用后写入的文本。

SetConsoleScreenBufferInfoEx:设置有关指定控制台屏幕缓冲区的扩展信息。

对于注释,在控制台文本的属性上,SetConsoleTextAttribute可以SetConsoleScreenBufferInfoEx达到同样的效果,比如改变文本的颜色或者加下划线。


推荐阅读