Цветной текст C в терминальных приложениях в Windows

Я знаю "textcolor();" для С++, и я видел методы для Unix... но есть ли способ для Windows?

#include <stdio.h>
int main()
{
    printf("\ntest - C programming text color!");
    printf("\n--------------------------------");
    printf("\n\n\t\t-BREAK-\n\n");
    textcolor(15);
    printf("WHITE\n");
    textcolor(0);
    printf("BLACK\n");
    textcolor(4);
    printf("RED\n");
    textcolor(1);
    printf("BLUE\n");
    textcolor(2);
    printf("GREEN\n");
    textcolor(5);
    printf("MAGENTA\n");
    textcolor(14);
    printf("YELLOW\n");
    textcolor(3);
    printf("CYAN\n");
    textcolor(7);
    printf("LIGHT GRAY\n");
}

Я ничего не могу найти в сети... будем надеяться, что добрые люди из переполнения стека могут помочь: D

C пожалуйста, а не C++


person Joe DF    schedule 08.02.2012    source источник
comment
Я использую escape-коды ANSI как для git bash, так и для MSYS2 в Windows, все работает нормально.   -  person ianfun    schedule 29.07.2021


Ответы (3)


Поскольку вам нужно решение для C и Windows, я бы рекомендовал использовать функцию SetConsoleTextAttribute() в Win32 API. Вам нужно будет получить дескриптор консоли, а затем передать его с соответствующими атрибутами.

В качестве простого примера:

/* Change console text color, then restore it back to normal. */
#include <stdio.h>
#include <windows.h>

int main() {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
    WORD saved_attributes;

    /* Save current attributes */
    GetConsoleScreenBufferInfo(hConsole, &consoleInfo);
    saved_attributes = consoleInfo.wAttributes;

    SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE);
    printf("This is some nice COLORFUL text, isn't it?");

    /* Restore original attributes */
    SetConsoleTextAttribute(hConsole, saved_attributes);
    printf("Back to normal");

    return 0;
}

Дополнительные сведения о доступных атрибутах см. на странице здесь.

Надеюсь это поможет! :)

person Miguel    schedule 08.02.2012
comment
Большое спасибо, все отлично работает, просто интересно, как вернуть светло-серый цвет по умолчанию? Большое спасибо! - person Joe DF; 09.02.2012
comment
@JoeDF Для этого вам нужно прочитать исходные атрибуты с помощью GetConsoleScreenBufferInfo(), сохранить их в переменной, а затем восстановить их, когда закончите. Я обновил ответ, чтобы показать, как это сделать. :) - person Miguel; 09.02.2012
comment
@JoeDF Не проблема. И если вы считаете, что на ваш вопрос дан ответ, не стесняйтесь принять ответ... :) - person Miguel; 10.02.2012


Я добавляю простой скрипт, который просто достигает этого, некоторые соображения:

#include <stdio.h>
#include <windows.h>
#include <conio.h>


void InitConsole()
{
    
    WORD wColor = (BACKGROUND_GREEN | FOREGROUND_BLUE);
    HANDLE handleConsole = GetStdHandle(STD_OUTPUT_HANDLE); /* Handle to current output buffer*/
    COORD coord = {0, 0};
    DWORD count;

    CONSOLE_SCREEN_BUFFER_INFO consoleBuffer;
    SetConsoleTextAttribute(handleConsole, wColor);
    if (GetConsoleScreenBufferInfo(handleConsole, &consoleBuffer))
        FillConsoleOutputAttribute(handleConsole, consoleBuffer.wAttributes, consoleBuffer.dwSize.X * consoleBuffer.dwSize.Y, coord, &count);
    
    return;
}   


int main() 
{
    InitConsole();
    SetConsoleTitle("Mini Desktop App"); 
    while(1){
        printf("Works as expected\n");
        printf("Press any Key to exit :)\n");
        getch();
        break;
    }

    return 0;

}

Использование определенных аргументов

#include <stdio.h>
#include <windows.h>
#include <conio.h>


void InitConsole(int ForgC, int BackC)
{
    WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
    HANDLE handleConsole = GetStdHandle(STD_OUTPUT_HANDLE); /* Handle to current output buffer*/
    COORD coord = {0, 0};
    DWORD count;

    CONSOLE_SCREEN_BUFFER_INFO consoleBuffer;
    SetConsoleTextAttribute(handleConsole, wColor);
    if (GetConsoleScreenBufferInfo(handleConsole, &consoleBuffer))
        FillConsoleOutputAttribute(handleConsole, consoleBuffer.wAttributes, consoleBuffer.dwSize.X * consoleBuffer.dwSize.Y, coord, &count);
    
    return;
}   
    


int main() 
{
    InitConsole(15, 1);
    SetConsoleTitle("Mini Desktop App"); 
    while(1){
        printf("Works as expected\n");
        printf("Press any Key to exit :)\n");
        getch();
        break;
    }

    return 0;

}

Документация

person Federico Baù    schedule 28.12.2020