Разноцветная консоль используя 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, в данной среде, компиляция проходила без ошибок, естественно для текущих версий сред разработок, нужно внести исправления в код.
Обсуждение закрыто.