diff --git a/ColorUI.cpp b/ColorUI.cpp index d152b71..39bdc47 100644 --- a/ColorUI.cpp +++ b/ColorUI.cpp @@ -1,5 +1,6 @@ #include "ColorUI.h" #include +#include namespace _ColorUI_Internal_Namespace { @@ -10,70 +11,195 @@ public: _auto_init_console_info_class() { hout=GetStdHandle(STD_OUTPUT_HANDLE); - CONSOLE_SCREEN_BUFFER_INFO tinfo; + CONSOLE_SCREEN_BUFFER_INFO tInfo; GetConsoleScreenBufferInfo(hout,&tInfo); - color=tinfo.wAttributes; + color=tInfo.wAttributes; } HANDLE hout; WORD color; }_auto_init_console_info_obj; -void cprint(ConsoleColor FrontColor,ConsoleColor BackColor) +inline ConsoleColor _winColor2ConsoleColor(int winColor) { - int iFront=0; - int iBack=0; - switch(FrontColor) + switch(winColor) + { + case 0: + return ConsoleColor::black; + case FOREGROUND_BLUE: + case BACKGROUND_BLUE: + return ConsoleColor::blue; + case FOREGROUND_GREEN: + case BACKGROUND_GREEN: + return ConsoleColor::green; + case FOREGROUND_RED: + case BACKGROUND_RED: + return ConsoleColor::red; + case FOREGROUND_GREEN | FOREGROUND_BLUE: + case BACKGROUND_GREEN | BACKGROUND_BLUE: + return ConsoleColor::lightblue; + case FOREGROUND_RED | FOREGROUND_BLUE: + case BACKGROUND_RED | BACKGROUND_BLUE: + return ConsoleColor::purple; + case FOREGROUND_RED | FOREGROUND_GREEN: + case BACKGROUND_RED | BACKGROUND_GREEN: + return ConsoleColor::yellow; + case FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED: + case BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED: + return ConsoleColor::white; + } +} + +inline int _ConsoleColor2winForeColor(ConsoleColor conColor) +{ + switch(conColor) { case ConsoleColor::black: - iFront=0;break; + return 0; case ConsoleColor::blue: - iFront=FOREGROUND_BLUE;break; - case ConsoleColor::lightblue: - iFront=FOREGROUND_GREEN | FOREGROUND_BLUE;break; + return FOREGROUND_BLUE; case ConsoleColor::green: - iFront=FOREGROUND_GREEN;break; - case ConsoleColor::purple: - iFront=FOREGROUND_RED |FOREGROUND_BLUE;break; + return FOREGROUND_GREEN; case ConsoleColor::red: - iFront=FOREGROUND_RED;break; - case ConsoleColor::white: - iFront=FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED; break; + return FOREGROUND_RED; + case ConsoleColor::lightblue: + return FOREGROUND_GREEN | FOREGROUND_BLUE; + case ConsoleColor::purple: + return FOREGROUND_RED |FOREGROUND_BLUE; case ConsoleColor::yellow: - iFront=FOREGROUND_RED | FOREGROUND_GREEN;break; + return FOREGROUND_RED | FOREGROUND_GREEN; + case ConsoleColor::white: + return FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED; } - switch(BackColor) +} + +inline int _ConsoleColor2winBackColor(ConsoleColor conColor) +{ + switch(conColor) { case ConsoleColor::black: - iBack=0;break; + return 0; case ConsoleColor::blue: - iBack=BACKGROUND_BLUE;break; - case ConsoleColor::lightblue: - iBack=BACKGROUND_GREEN | BACKGROUND_BLUE;break; + return BACKGROUND_BLUE; case ConsoleColor::green: - iFront=BACKGROUND_GREEN;break; - case ConsoleColor::purple: - iBack=BACKGROUND_RED | BACKGROUND_BLUE;break; + return BACKGROUND_GREEN; case ConsoleColor::red: - iBack=BACKGROUND_RED;break; - case ConsoleColor::white: - iBack=BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED; break; + return BACKGROUND_RED; + case ConsoleColor::lightblue: + return BACKGROUND_GREEN | BACKGROUND_BLUE; + case ConsoleColor::purple: + return BACKGROUND_RED | BACKGROUND_BLUE; case ConsoleColor::yellow: - iBack=BACKGROUND_RED | BACKGROUND_GREEN;break; + return BACKGROUND_RED | BACKGROUND_GREEN; + case ConsoleColor::white: + return BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED; } +} + +inline void cprint(ConsoleColor FrontColor,ConsoleColor BackColor) +{ + int iFront=_ConsoleColor2winBackColor(FrontColor); + int iBack=_ConsoleColor2winBackColor(BackColor); if(iFront!=0) iFront=iFront | FOREGROUND_INTENSITY; if(iBack!=0) iBack=iBack| BACKGROUND_INTENSITY; SetConsoleTextAttribute(_auto_init_console_info_obj.hout,iFront | iBack ); } -void cprint() +inline void cprint() { SetConsoleTextAttribute(_auto_init_console_info_obj.hout,_auto_init_console_info_obj.color); } +int _last_keyval; +int _GetUserInputKey_Real() +{ + return _last_keyval=getch();///defined in conio.h +} + +enum class KEY { UNDEF=0, UP, DOWN, LEFT, RIGHT, CONFIRM, ESC, HOME, END }; +int _last_isSpecial; + +KEY GetUserInputKey() +{ + int a=_GetUserInputKey_Real(); + if(a==224||a==0) + { + _last_isSpecial=1; + int b=_GetUserInputKey_Real(); + switch(b) + { + case 72:return KEY::UP; + case 80:return KEY::DOWN; + case 75:return KEY::LEFT; + case 77:return KEY::RIGHT; + case 71:return KEY::HOME; + case 79:return KEY::END; + default:return KEY::UNDEF; + } + } + else + { + _last_isSpecial=0; + switch(a) + { + case ' ':case '\r':case '\n':case '5': + return KEY::CONFIRM; + case 'w':case 'W':case '8': + return KEY::UP; + case 's':case 'S':case '2': + return KEY::DOWN; + case 'a':case 'A':case '4': + return KEY::LEFT; + case 'd':case 'D':case '6': + return KEY::RIGHT; + case 27: + return KEY::ESC; + + default: + return KEY::UNDEF; + } + } +} + +int GetAction(int& cid,int MinVal,int MaxVal,int EscapeVal=MaxVal) +{ + KEY t=GetUserInputKey(); + switch(t) + { + case KEY::UP: + { + cid=std::max(std::min(cid-1,MaxVal),MinVal); + return 0; + } + case KEY::DOWN: + { + cid=std::max(std::min(cid+1,MaxVal),MinVal); + return 0; + } + case KEY::ESC: + { + cid=EscapeVal; + return 0; + } + case KEY::CONFIRM: + return 1; + case KEY::HOME: + { + cid=MinVal; + return 0; + } + case KEY::END: + { + cid=MaxVal; + return 0; + } + default: + return 0; + } +} + }/// End of namespace _ColorUI_Internal_Namespace ColorSelection::ColorSelection() { - frontColor=ConsoleColor::white; - backColor=ConsoleColor::black; + } diff --git a/ColorUI.h b/ColorUI.h index 37f0584..8b6beef 100644 --- a/ColorUI.h +++ b/ColorUI.h @@ -1,8 +1,13 @@ #pragma once #include +#include +#include enum class ConsoleColor { black=0,red=1,green=2,yellow=3,blue=4,purple=5,lightblue=6,deepgreen=6,white=7 }; +/// Fwd DECL +class ColorFrame; + class ColorSelection { public: