如何更改控制台的整体背景颜色? 我已经尝试了 SetConsoleTextAttribute
,但它只会更改新文本的背景颜色。
实际上,我希望在出现严重错误时整个控制台都变成红色。
感谢每个尝试帮助的人。
如何更改控制台的整体背景颜色? 我已经尝试了 SetConsoleTextAttribute
,但它只会更改新文本的背景颜色。
实际上,我希望在出现严重错误时整个控制台都变成红色。
感谢每个尝试帮助的人。
FillConsoleOutputAttribute
函数可以满足您的需求。将其设置为控制台的起始坐标,将nLength
设置为控制台中字符的数量(width * length
)。BOOL WINAPI FillConsoleOutputAttribute(
__in HANDLE hConsoleOutput,
__in WORD wAttribute,
__in DWORD nLength,
__in COORD dwWriteCoord,
__out LPDWORD lpNumberOfAttrsWritten
);
system("color c2");
system
调用速度较慢。 - greatwolf我知道这是一个老问题,但是这段代码怎么样:
#include <windows.h>
#include <iostream>
VOID WINAPI SetConsoleColors(WORD attribs);
int main() {
SetConsoleColors(BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
std::cout << "Hello, world!" << std::endl;
std::cin.get();
return 0;
}
VOID WINAPI SetConsoleColors(WORD attribs) {
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFOEX cbi;
cbi.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);
GetConsoleScreenBufferInfoEx(hOutput, &cbi);
cbi.wAttributes = attribs;
SetConsoleScreenBufferInfoEx(hOutput, &cbi);
}
#include "Windows.h"
void FlashConsoleBackgroundColor(int cntFlashes, int flashInterval_ms, COLORREF color)
{
CONSOLE_SCREEN_BUFFER_INFOEX sbInfoEx;
sbInfoEx.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);
HANDLE consoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfoEx(consoleOut, &sbInfoEx);
COLORREF storedBG = sbInfoEx.ColorTable[0];
for (int i = 0; i < cntFlashes; ++i)
{
//-- set BG color
Sleep(flashInterval_ms);
sbInfoEx.ColorTable[0] = color;
SetConsoleScreenBufferInfoEx(consoleOut, &sbInfoEx);
//-- restore previous color
Sleep(flashInterval_ms);
sbInfoEx.ColorTable[0] = storedBG;
SetConsoleScreenBufferInfoEx(consoleOut, &sbInfoEx);
}
}
int main()
{
printf("Flashing console BG: RED");
FlashConsoleBackgroundColor(20, 50, RGB(255, 0, 0));
printf("\rFlashing console BG: ORANGE\n");
FlashConsoleBackgroundColor(10, 100, RGB(255, 105, 0));
return 0;
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x96); printf("Some previous console output\n");
...它就会失败。我的示例仅更改一个颜色,即无论之前打印了什么,都会更改背景的颜色。此外,作为奖励,您可以将其设置为自定义RGB。 - Killzone KidHANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(out, 0x9 | 0x70);
// text color from 0x1-0x9
// text background color from 0x10-0x90
system("color d1");
/*
Sets the default console foreground and background colors
COLOR [attr]
attr Specifies color attribute of console output
Color attributes are specified by TWO hex digits -- the first
corresponds to the background; the second the foreground. Each digit
can be any of the following values:
0 = Black 8 = Gray
1 = Blue 9 = Light Blue
2 = Green A = Light Green
3 = Aqua B = Light Aqua
4 = Red C = Light Red
5 = Purple D = Light Purple
6 = Yellow E = Light Yellow
7 = White F = Bright White
If no argument is given, this command restores the color to what it was
when CMD.EXE started. This value either comes from the current console
window, the /T command line switch or from the DefaultColor registry
value.
The COLOR command sets ERRORLEVEL to 1 if an attempt is made to execute
the COLOR command with a foreground and background color that are the
same.
/*
这对我很有效。它通过逐个更改每个控制台字符单元,而不会弄乱已显示的文本的前景色,从而更改背景颜色。您需要获取控制台输出缓冲区的句柄,我相信可以使用GetStdHandle()来完成。
DWORD written = 0;
COORD writeCoord = {0};
WORD attribute;
for (int y = 0; y < consoleBufferLength; y++) // rows
{
for (int x = 0; x < consoleBufferWidth; x++) // columns
{
writeCoord.X = x; writeCoord.Y = y;
ReadConsoleOutputAttribute(consoleOutputHandle, &attribute, 1, writeCoord, &written);
attribute &= 0xFF0F; // zero the background color
attribute |= 12 << 4; // change the background color to red
FillConsoleOutputAttribute(consoleOutputHandle, attribute, 1, writeCoord, &written);
}
}
我这里有一个不太优雅的方法,但可以得到你想要的结果。
#include <windows.h>
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole,30);
system("CLS");
color 4f
,就这样。 :-) - Cheers and hth. - Alfsystem("cmd /c \"color 4F\"")
。 - David R Tribble