Перейти к содержимому

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

Разноцветная консоль используя 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&lt;17;i++)
                        {
                                for(int j=0;j&lt;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;
}
Метки: