Найти тему
D21nk Master

Добавим цвета в Windows

Мы рассмотрели цвета терминала в Linux,стоит добавить,что не все терминалы способны поддерживать спец. коды,хоть я таких ещё не встречал.Сегодня рассмотрим как можно работать с цветом в консоли Windows.

Я уже говорил,что у Linux куда больше возможностей в этом плане,чем у Windows.Если терминал изначально способен взаимодействовать с цветом,то для командной строки нужна функция из WinApi.Да,мы с ним ещё не знакомы,там на самом деле ничего сложного,просто библиотека.

Сама функция содержится в библиотеке windows.h и имеет причудливое название,как и большинство функций из WinApi,а именно SetConsoleTextAttr.Принимает она текущий поток окна и цвет.

Для получения необходима текущего потока консоли пригодится GetStdHandle.Принимает просто определённую константу,мы возьмём только на вывод.

Перед практикой рассмотрим какие цвета вообще доступны:

FOREGROUND_BLUE | Содержит синий цвет текста.

FOREGROUND_GREEN | Содержит зеленый цвет текста.

FOREGROUND_RED | Содержит красный цвет текста.

FOREGROUND_INTENSITY | Устанавливает цвет текста более интенсивный.

BACKGROUND_BLUE | Содержит синий цвет фона.

BACKGROUND_GREEN | Содержит зеленый цвет фона.

BACKGROUND_RED | Содержит красный цвет фона.

BACKGROUND_INTENSITY | Устанавливает цвет фона более интенсивный.

COMMON_LVB_REVERSE_VIDEO | Изменяет на противоположные атрибуты цвета текста и цвета фона.

COMMON_LVB_UNDERSCORE | Подчеркивает.

Теперь рассмотрим как это всё применить:

//HANDLE-это просто указатель

HANDLE std=GetStdHandle(STD_OUTPUT_HANDLE);

//установим цвет текста красным

SetConsoleTextAttribute(std,FOREGROUND_RED);

printf("Red text\n");

SetConsoleTextAttribute(std,(WORD)7);

Последняя операция возвращает текста на белый,кодов,что могли бы просто сбросить всё по умолчанию я не нашёл.Что означают эти скобки-я расскажу в следующих уроках.

Вообще в документации имеются только эти цвета,но на самом деле их 16,как использовать их все я так же поведаю в следующих уроках.А пока рекомендую перенять мой опыт и просто написать функцию,которая будет всё упрощать:

void colorstr(WORD color,char *str)

{

HANDLE std=GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleTextAttribute(std,color);

printf("%s\n",str);

SetConsoleTextAttribute(std,(WORD)7);

}

Всё может показать запутанным,как собственно весь WinApi,особенно после программирования под Linux,но вот такие функции "спасают",с ними становится прощё.

Домашнее задание такое же как и для Linux.

С вами был D21nkMaster.Всего наилучшего!