1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
// TUI.h
// same as last, but modified into a class, everything other than input not working
// classe para gerar interface gráfica em modo texto
// definições de cores
#define tui_black 0b0000
#define tui_dred 0b0001
#define tui_dyellow 0b0011
#define tui_dgreen 0b0010
#define tui_dcyan 0b0110
#define tui_dblue 0b0100
#define tui_dmagenta 0b0101
#define tui_bgray 0b0111
#define tui_dgray 0b1000
#define tui_bred 0b1001
#define tui_byellow 0b1011
#define tui_bgreen 0b1010
#define tui_bcyan 0b1110
#define tui_bblue 0b1100
#define tui_bmagenta 0b1101
#define tui_white 0b1111
class TUI {
private:
// variáveis utilizadas pela biblioteca windows
static COORD position;
static HANDLE handle;
static CONSOLE_CURSOR_INFO conCurInf;
static DWORD eventCount;
static INPUT_RECORD inputRecord;
static DWORD numberRead;
static int color;
static bool haveHappened;
static int i;
public:
TUI () {}
static void init () {
handle = GetStdHandle(STD_INPUT_HANDLE);
}
static void setConsoleName (char * NAME) { // altera o título da janela
SetConsoleTitle(NAME);
}
static void setCurPos (int X, int Y) { // altera a posição do cursor
position.X = X;
position.Y = Y;
SetConsoleCursorPosition(handle,position);
}
static void clearScreen () { // limpa a tela
for (int i = 0; i < 60; i++) printf("\n");
}
static void setCursor (int SIZE = 100, bool STATE = true) { // altera o tamanho do cursor e o liga/desliga
if (SIZE > 100) SIZE = 100;
conCurInf.dwSize = SIZE;
conCurInf.bVisible = STATE;
SetConsoleCursorInfo(handle,&conCurInf);
}
static void setColor (int FCOLOR, int BCOLOR) { // muda a cor do texto (foreground) e do fundo (background)
color = 0;
color |= ((getbit(FCOLOR,3) == 1)?FOREGROUND_INTENSITY:0);
color |= ((getbit(FCOLOR,2) == 1)?FOREGROUND_BLUE:0);
color |= ((getbit(FCOLOR,1) == 1)?FOREGROUND_GREEN:0);
color |= ((getbit(FCOLOR,0) == 1)?FOREGROUND_RED:0);
color |= ((getbit(BCOLOR,3) == 1)?BACKGROUND_INTENSITY:0);
color |= ((getbit(BCOLOR,2) == 1)?BACKGROUND_BLUE:0);
color |= ((getbit(BCOLOR,1) == 1)?BACKGROUND_GREEN:0);
color |= ((getbit(BCOLOR,0) == 1)?BACKGROUND_RED:0);
SetConsoleTextAttribute(handle,color);
}
static bool getKey (char * KEY) {
// retorna se havia uma tecla pressionada no momento da chamada e se havia, guarda qual tecla no parâmetro
GetNumberOfConsoleInputEvents(handle,&eventCount);
haveHappened = false;
while (eventCount > 0) {
ReadConsoleInput(handle,&inputRecord,1,&numberRead);
if (inputRecord.EventType == KEY_EVENT) {
if (inputRecord.Event.KeyEvent.bKeyDown) {
*KEY = inputRecord.Event.KeyEvent.wVirtualKeyCode;
haveHappened = true;
}
}
GetNumberOfConsoleInputEvents(handle,&eventCount);
}
return haveHappened;
}
};
// bug do C++: quando coisas são declaradas como 'static' (e const também), elas perdem suas referências,
// e só é possível obter o valor que elas guardam, como '#defines'
// para restaurar a referência, é necessário declarar as variáveis como segue:
COORD TUI::position;
HANDLE TUI::handle;
CONSOLE_CURSOR_INFO TUI::conCurInf;
DWORD TUI::eventCount;
INPUT_RECORD TUI::inputRecord;
DWORD TUI::numberRead;
int TUI::color;
bool TUI::haveHappened;
int TUI::i;
|