簡體   English   中英

SetConsoleScreenBufferInfoEx 的工作方式與 SetConsoleTextAttribute 不同

[英]SetConsoleScreenBufferInfoEx works different from 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;
}

該標志是為了確保所有 function 返回 TRUE

在第一個代碼中,“代碼 1”將保留沒有下划線,“Hello World”將有下划線。 和“再見世界!” 不會有下划線。

在第二個代碼中,所有內容都會有下划線,直到我輸入新行,然后所有內容都會失去下划線。

有誰知道為什么會這樣? 我雖然他們會對控制台文本屬性做同樣的事情。

謝謝,羅伊

在第二個代碼中,所有內容都會有下划線,直到我輸入新行,然后所有內容都會失去下划線。

經過我的測試,兩段代碼的最終效果是一樣的。

在此處輸入圖像描述

有誰知道為什么會這樣? 我雖然他們會對控制台文本屬性做同樣的事情。

SetConsoleTextAttribute:設置由 WriteFile 或 WriteConsole function 或由 ReadFile 或 ReadConsole function 回顯到控制台屏幕緩沖區的字符的屬性。 此 function 影響在 function 調用之后寫入的文本。

SetConsoleScreenBufferInfoEx:設置有關指定控制台屏幕緩沖區的擴展信息。

對於注釋,在控制台文本的屬性上, SetConsoleTextAttributeSetConsoleScreenBufferInfoEx可以達到相同的效果,比如改變文本的顏色或者添加下划線。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM