Разноцветная консоль используя 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;
}
SetConsoleTitle(«Code by Lazy_elf»); — ошибка. должно быть:
SetConsoleTitle(L»Code by Lazy_elf»);
Делал эту программу очень давно, использовал MS Visual C++ 6.0, в данной среде, компиляция проходила без ошибок, естественно для текущих версий сред разработок, нужно внести исправления в код.
Обсуждение закрыто.