【问题标题】:SetConsoleScreenBufferInfoEx works different from SetConsoleTextAttributeSetConsoleScreenBufferInfoEx 的工作方式与 SetConsoleTextAttribute 不同
【发布时间】:2020-02-22 07:23:35
【问题描述】:

最近我尝试在 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 winapi console


【解决方案1】:

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

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

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

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

SetConsoleScreenBufferInfoEx:设置关于 指定的控制台屏幕缓冲区。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    相关资源
    最近更新 更多