Разноцветная консоль используя C++

Разноцветная консоль используя C++

Опять ночь и снова не могу уснуть, появилась мысль о схожести ночного неба и стандартной консоли Windows, попробуем это исправить.
Консоль – это интерфейс для программ, работающих в текстовом режиме, она имеет буфер ввода и несколько экранных буферов (двухмерный массив, содержащий коды символов и их атрибуты). Всю черновую работу, по созданию (AllocConsole) и удалению (FreeConsole) консоли возложим на Visual С++. Основные функции, которые пригодятся нам.

BOOL SetConsoleTitle(LPCTSTR lpConsoleTitle); - Устанавливаем имя консоли, которое будет находится в заголовке. По умолчанию, в заголовке выводится путь к программе.

lpConsoleTitle – указатель на строку содержащий имя.

HANDLE GetStdHandle(DWORD nStdHandle); - Получении хэндла стандартного потока ввода-вывода.

nStdHandle – номер потока, хэндл которого нам нужен:

STD_INPUT_HANDLE – поток ввода;
STD_OUTPUT_HANDLE – поток вывода;
STD_ERROR_HANDLE – поток ошибок.

В случае ошибки функция возвращает INVALID_HANDLE_VALUE, иначе хэндл.

BOOL SetConsoleCursorPosition(HANDLE hConsoleOutput, COORD dwCursorPosition); - Установка позиции курсора в консоли.
hConsoleOutput – хэндл вывода консоли;
dwCursorPosition – координаты новой позиции:

typedef struct _COORD {SHORT X; SHORT Y; } COORD; - x и y координаты.

BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes); - Установка атрибутов текста.

hConsoleOutput – хэндл вывода консоли;

wAttributes – цвет фона и текста, это сочетание нескольких флагов:

FOREGROUND_BLUE – текст синим;
FOREGROUND_GREEN – текст зеленым;
FOREGROUND_RED – текст красным;
FOREGROUND_INTENSITY – повышенная интенсивность;
BACKGROUND_BLUE – фон синим;
BACKGROUND_GREEN – фон зеленым;
BACKGROUND_RED – фон красным;
BACKGROUND_INTENSITY – повышенная интенсивность.

Теперь пробуем, запускайте Visual C++ 6.0, создавайте новый проект «Win32 Console Application», дальше «An empty project» и Finish. После File -> New -> C++ Source File.

Напишите следующий код:

#include <windows.h>
#include <iostream>
using namespace std;
 
int main()
{
        int iPic[17][20] = {
                {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3},
                {0,1,0,0,0,1,1,0,0,0,1,1,1,1,0,1,0,1,0,3},
                {0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,1,0,3},
                {0,1,0,0,0,1,0,0,1,0,0,0,0,1,0,1,0,1,0,3},
                {0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,1,1,0,3},
                {0,1,0,0,0,1,1,1,1,0,0,1,0,0,0,0,0,1,0,3},
                {0,1,1,1,0,1,0,0,1,0,1,1,1,1,0,1,1,1,0,3},
                {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3},
                {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3},
                {0,1,1,1,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,3},
                {0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,3},
                {0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,3},
                {0,1,1,1,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,3},
                {0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,3},
                {0,1,1,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,3},
                {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3}};             
        HANDLE hStd;
        COORD  coXY;
        SetConsoleTitle("Code by Lazy_elf");
        hStd = GetStdHandle(STD_OUTPUT_HANDLE);
        if(hStd != INVALID_HANDLE_VALUE)
        {
                coXY.X = 7;
                coXY.Y = 7;
                if(SetConsoleCursorPosition(hStd,coXY))
                {
                        for(int i=0;i<17;i++)
                        {
                                for(int j=0;j<20;j++)
                                {
                                        if(iPic[i][j] == 0)
                                        {
                                                if(SetConsoleTextAttribute(hStd,BACKGROUND_RED|FOREGROUND_RED))
                                                {cout<<(char)219;}
                                        }
                                        if(iPic[i][j] == 1)
                                        {
                                                if(SetConsoleTextAttribute(hStd,FOREGROUND_GREEN|FOREGROUND_INTENSITY))
                                                {cout<<(char)177;}
                                        }
                                        if(iPic[i][j] == 3)
                                        {
                                                coXY.Y++;
                                                if(!SetConsoleCursorPosition(hStd,coXY)){cout<<"Error SetConsoleCursorPosition"<<endl;}
                                        }
                                }
                        }
        
                }else{cout<<"Error SetConsoleCursorPosition..."<<endl;}
                if(!CloseHandle(hStd)){cout<<"Error CloseHandle..."<<endl;}
        }else{cout<<"Error GetStdHandle..."<<endl;}
        return 0;
}

Разноцветная консоль используя C++: 2 комментария

  1. Николай

    SetConsoleTitle(«Code by Lazy_elf»); — ошибка. должно быть:
    SetConsoleTitle(L»Code by Lazy_elf»);

    1. Lazy_elf Автор записи

      Делал эту программу очень давно, использовал MS Visual C++ 6.0, в данной среде, компиляция проходила без ошибок, естественно для текущих версий сред разработок, нужно внести исправления в код.

Комментарии запрещены.