![](/img/trans.png)
[英]Returning SetConsoleTextAttribute colour value from function in c
[英]SetConsoleScreenBufferInfoEx works different from SetConsoleTextAttribute
最近我嘗試用下划線在 C 中打印文本。 我的控制台不支持 ANSI 轉義字符,所以我嘗試使用我的控制台支持的 DBCS。 為此,我必須更改控制台文本屬性。 一開始我使用SetConsoleTextAttribute
來更改它,但后來當我想記住顏色並且只更改下划線時,我開始使用GetConsoleScreenBufferInfoEx
和SetConsoleScreenBufferInfoEx
來獲取以前的屬性。 那時我注意到,當我使用前者時,它只會影響我在調用后打印的文本,而在后者的情況下,我也會更改之前文本的屬性。
例如,我寫了 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;
}
在第一個代碼中,“代碼 1”將保留沒有下划線,“Hello World”將有下划線。 和“再見世界!” 不會有下划線。
在第二個代碼中,所有內容都會有下划線,直到我輸入新行,然后所有內容都會失去下划線。
有誰知道為什么會這樣? 我雖然他們會對控制台文本屬性做同樣的事情。
謝謝,羅伊
在第二個代碼中,所有內容都會有下划線,直到我輸入新行,然后所有內容都會失去下划線。
經過我的測試,兩段代碼的最終效果是一樣的。
有誰知道為什么會這樣? 我雖然他們會對控制台文本屬性做同樣的事情。
SetConsoleTextAttribute:設置由 WriteFile 或 WriteConsole function 或由 ReadFile 或 ReadConsole function 回顯到控制台屏幕緩沖區的字符的屬性。 此 function 影響在 function 調用之后寫入的文本。
SetConsoleScreenBufferInfoEx:設置有關指定控制台屏幕緩沖區的擴展信息。
對於注釋,在控制台文本的屬性上, SetConsoleTextAttribute
和SetConsoleScreenBufferInfoEx
可以達到相同的效果,比如改變文本的顏色或者添加下划線。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.