例如,我知道我可以这样做system("color 1E")
,但我很好奇是否有一个 api 调用可以做到这一点,因为这些更快,我需要像color
这样为所有控制台着色。我知道的只有 api 调用,SetConsoleTextAttribute()
但这只是为使用后编写的文本着色。
问问题
378 次
3 回答
5
我调试了 cmd.exe(在 Windows 7 上),这是“颜色”命令的作用:
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csBufferInfo;
GetConsoleScreenBufferInfo(hConsole, &csBufferInfo);
DWORD dwLength = csBufferInfo.dwSize.X * csBufferInfo.dwSize.Y;
COORD dwOrigin = { 0 };
DWORD dwWritten = 0;
FillConsoleOutputAttribute(hConsole, wAttribute, dwLength, dwOrigin, &dwWritten);
SetConsoleTextAttribute(hConsole, wAttribute);
在哪里wAttribute
保存你想要的颜色。
于 2012-06-01T17:38:17.703 回答
1
WriteConsoleOutputAttribute可用于将字符属性写入屏幕缓冲区中的连续单元格。这将更改屏幕缓冲区中每个单元格的属性,而无需修改现有文本。
#include <windows.h>
int main(int argc, char* argv[])
{
CONSOLE_SCREEN_BUFFER_INFO sb;
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
WORD attr = BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE;
COORD c = {0};
int row, col;
GetConsoleScreenBufferInfo(h, &sb);
for(row = 0; row < sb.dwSize.Y; row++)
{
c.Y = row;
for(col = 0; col < sb.dwSize.X; col++)
{
c.X = col;
WriteConsoleOutputAttribute(h, &attr, 1, c, NULL);
}
}
}
请注意,您还需要使用SetConsoleTextAttribute()
,因为编写的新文本仍将使用旧属性。
于 2012-06-01T16:08:33.410 回答
0
我从多个来源编译了这个答案。基本思想在
http://www.cplusplus.com/forum/beginner/5830/。
但是,他们使用 system("cls")。
S,我尝试用这里提到的技术替换 system("cls") 。http://support.microsoft.com/kb/99261
结果是你所期望的。
它看起来不漂亮。但是,我认为这是一个答案。祝你好运。
于 2012-06-01T16:07:09.660 回答