0

例如,我知道我可以这样做system("color 1E"),但我很好奇是否有一个 api 调用可以做到这一点,因为这些更快,我需要像color这样为所有控制台着色。我知道的只有 api 调用,SetConsoleTextAttribute()但这只是为使用后编写的文本着色。

4

3 回答 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 回答