Jag kunde inte låta bli att roa mig lite...
Inget avancerat. Byta färg och flytta markör.
#include <iostream>
#include <windows.h>
namespace DOS
{
static HANDLE hout;
static HANDLE hin;
static WORD current_attrib;
static WORD old_attrib;
static short width;
static short height;
void init()
{
hout = GetStdHandle(STD_OUTPUT_HANDLE);
hin = GetStdHandle(STD_INPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO info;
GetConsoleScreenBufferInfo(hout, &info);
old_attrib = current_attrib = info.wAttributes;
width = info.srWindow.Right + 1;
height = info.srWindow.Bottom + 1;
}
enum COLOR {BLACK, WHITE, RED, BLUE, YELLOW};
enum BGCOLOR {BG_BLACK, BG_WHITE, BG_RED, BG_BLUE, BG_YELLOW};
enum ATTRIB {RESET};
enum ARROW {NONE, UP, DOWN, LEFT, RIGHT};
void set_color_attrib(bool red, bool green, bool blue, bool intensity)
{
current_attrib = red ? current_attrib | FOREGROUND_RED :
current_attrib & ~FOREGROUND_RED;
current_attrib = green ? current_attrib | FOREGROUND_GREEN :
current_attrib & ~FOREGROUND_GREEN;
current_attrib = blue ? current_attrib | FOREGROUND_BLUE :
current_attrib & ~FOREGROUND_BLUE;
current_attrib = intensity ? current_attrib | FOREGROUND_INTENSITY :
current_attrib & ~FOREGROUND_INTENSITY;
}
std::ostream& operator<< (std::ostream& cout, const COLOR &color)
{
switch (color)
{
case BLACK:
set_color_attrib(0, 0, 0, 0);
break;
case WHITE:
set_color_attrib(1, 1, 1, 1);
break;
case RED:
set_color_attrib(1, 0, 0, 1);
break;
case BLUE:
set_color_attrib(0, 0, 1, 1);
break;
case YELLOW:
set_color_attrib(1, 1, 0, 1);
break;
}
SetConsoleTextAttribute(hout, current_attrib);
return cout;
}
std::ostream& operator<< (std::ostream& cout, const ATTRIB &attrib)
{
switch (attrib)
{
case RESET:
current_attrib = old_attrib;
SetConsoleTextAttribute(hout, current_attrib);
break;
}
return cout;
}
void set_bg_color_attrib(bool red, bool green, bool blue, bool intensity)
{
current_attrib = red ? current_attrib | BACKGROUND_RED :
current_attrib & ~BACKGROUND_RED;
current_attrib = green ? current_attrib | BACKGROUND_GREEN :
current_attrib & ~BACKGROUND_GREEN;
current_attrib = blue ? current_attrib | BACKGROUND_BLUE :
current_attrib & ~BACKGROUND_BLUE;
current_attrib = intensity ? current_attrib | BACKGROUND_INTENSITY :
current_attrib & ~BACKGROUND_INTENSITY;
}
std::ostream& operator<< (std::ostream& cout, const BGCOLOR &bg_color)
{
switch (bg_color)
{
case BG_BLACK:
set_bg_color_attrib(0, 0, 0, 0);
break;
case BG_WHITE:
set_bg_color_attrib(1, 1, 1, 1);
break;
case BG_RED:
set_bg_color_attrib(1, 0, 0, 1);
break;
case BG_BLUE:
set_bg_color_attrib(0, 0, 1, 1);
break;
case BG_YELLOW:
set_bg_color_attrib(1, 1, 0, 1);
break;
}
SetConsoleTextAttribute(hout, current_attrib);
return cout;
}
void clear_screen()
{
system("cls");
}
void set_position(short x, short y)
{
COORD coord = {x, y};
SetConsoleCursorPosition(hout, coord);
}
bool check_keyboard()
{
INPUT_RECORD input;
DWORD number_read = 0;
PeekConsoleInput(hin, &input, 1, &number_read);
return number_read > 0;
}
ARROW get_keyboard()
{
INPUT_RECORD input;
DWORD number_read = 0;
ReadConsoleInput(hin, &input, 1, &number_read);
if (input.EventType == KEY_EVENT)
{
switch (input.Event.KeyEvent.wVirtualKeyCode)
{
case VK_UP:
return UP;
case VK_DOWN:
return DOWN;
case VK_RIGHT:
return RIGHT;
case VK_LEFT:
return LEFT;
default:
return NONE;
}
}
else
return NONE;
}
std::istream& operator>> (std::istream& cin, ARROW &arrow)
{
arrow = get_keyboard();
return cin;
}
};
int main()
{
DOS::init();
DOS::clear_screen();
DOS::set_position(0, 0);
std::cout<<"Te"<<DOS::WHITE<<"s"<<DOS::RESET<<"t"<<std::endl;
std::cout<<DOS::YELLOW;
std::cout<<"Width: "<<DOS::width<<std::endl;
std::cout<<"Height: "<<DOS::height<<std::endl;
std::cout<<DOS::RED;
std::cout<<"Press arrow key..."<<std::flush;
DOS::ARROW arrow;
std::cin>>arrow;
switch (arrow)
{
case DOS::NONE:
std::cout<<"No arrow key!"<<std::endl;
break;
case DOS::UP:
std::cout<<"UP!"<<std::endl;
break;
case DOS::DOWN:
std::cout<<"DOWN!"<<std::endl;
break;
case DOS::RIGHT:
std::cout<<"RIGHT!"<<std::endl;
break;
case DOS::LEFT:
std::cout<<"LEFT!"<<std::endl;
break;
}
std::cout<<DOS::RED<<DOS::BG_BLUE;
DOS::set_position(0, 5);
std::cout<<"Test2"<<DOS::RESET<<std::endl;
}