spartanPAGE
Pomógł: 12 razy Dołączył: 07 Gru 2011 Posty: 103 Skąd: Hellada
|
Wysłany: Sob 27 Kwi, 2013 15:11
|
|
SHEC, C++
|
Witam, przedstawiam wam swoje, w sumie jeszcze nie dokończone (to co na linuxa),
najnowsze wypociny.
To 300-pare linijek ułatwiających tworzenie sam-nie-wiem-czego w konsoli, nosi nazwę
SHEC
Simple as Hell extended Console
To by było na tyle prologu. Na całość składa się tylko 1 plik nagłówkowy, tak więc nie ma możliwości bytu jakichkolwiek problemów z dołączaniem.
..kod...
Console.hpp:
Kod: | #ifndef _CONSOLE_HPP_
#define _CONSOLE_HPP_
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#if defined(_WIN32) || defined(WIN32) || defined(__BORLANDC__)
#define OS_WIN
#endif
#ifdef OS_WIN
#include <Windows.h>
#include <conio.h>
#else
/* TODO: LINUX */
#endif
typedef void(*_CON_VoidFunction)();
typedef bool(*_CON_BoolFunctionIntRIntR)(int &, int &);
namespace _CON_
{
struct MENUITEM
{
std::string Name;
int x;
int y;
_CON_BoolFunctionIntRIntR Func;
MENUITEM(std::string Name = "", int x = 0, int y = 0, _CON_BoolFunctionIntRIntR Func = [](int &x, int &y)->bool{ return true; }) : Name(Name), x(x), y(y), Func(Func) {}
};
}
class CONSOLE
{
private:
bool IsMenuExists;
std::vector<_CON_::MENUITEM> MenuItems;
_CON_::MENUITEM MenuCaption;
std::vector<int> ErrorsTable;
int MenuCaptionColor;
bool SelectByColor;
int SelectBySignColor;
char Sel_Sign;
int Sel_Col_True;
int Sel_Col_False;
bool Sel_Left;
public:
typedef _CON_VoidFunction VoidFunction;
typedef _CON_BoolFunctionIntRIntR BoolFunctionIntRIntR;
struct Colors
{
#ifdef OS_WIN
enum { BLACK = 0, RED = 4, GREEN = 2, YELLOW = 14, BLUE = 1, MAGNETA = 5, CYAN = 3, WHITE = 15 };
static const int BLINK = 128;
#else
enum { BLACK = 30, RED, GREEN, YELLOW, BLUE, MAGNETA, CYAN, WHITE };
static const int BLINK = 5;
#endif
};
void SetTextColor(int Color);
void GotoXY(const int x, const int y);
template<typename T>
void WriteXY(T item, int x, int y);
template<typename T>
std::ostream& operator<<(T item);
template<typename T>
std::istream& operator>>(T &item);
void WriteRainbow(std::string text);
void WriteRainbow(const char text[]);
void Pause(const char *text = NULL);
void Beep();
void ClearScreen();
void HideCursor();
void ShowCursor();
char GetKey();
bool IsKeyPressed();
void Sleep(int ms);
void MenuCreate(const char text[], int x, int y, int Color = Colors::WHITE);
void MenuSelectByColor(int Color_True, int Color_False);
void MenuSelectBySign(char Sign, bool Is_On_Left, int Color = Colors::WHITE);
void MenuLoop(char Up = 'w', char Down = 's', char Select = 13, VoidFunction AdditionalFunc = [](){});
void MenuAddItem(const char text[], int x, int y, CONSOLE::BoolFunctionIntRIntR Func = [](int &x, int &y)->bool{ return true; });
void MenuDestroy();
int GetLastError();
struct Errors
{
enum { NOTHING, MENU_NOT_CREATED, MENU_ALREADY_CREATED };
};
CONSOLE() : IsMenuExists(false) {}
} Console;
void CONSOLE::SetTextColor(int Color)
{
#ifdef OS_WIN
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), Color);
#else
/* TODO: LINUX; KOLORY SA JUZ PRZYGOTOWANE */
#endif
}
void CONSOLE::GotoXY(const int x, const int y)
{
#ifdef OS_WIN
COORD c = { x, y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
#else
printf("%c[%d;%df",0x1B,y,x);
#endif
}
template<typename T>
void CONSOLE::WriteXY(T item, int x, int y)
{
GotoXY(x, y);
std::cout << item;
}
template<typename T>
std::ostream& CONSOLE::operator<<(T item)
{
std::cout << item;
return std::cout;
}
template<typename T>
std::istream& CONSOLE::operator>>(T &item)
{
std::cin >> item;
return std::cin;
}
void CONSOLE::WriteRainbow(std::string text)
{
WriteRainbow(text.c_str());
}
void CONSOLE::WriteRainbow(const char text[])
{
int Color = 1;
for(int i = 0; text[i] != '\0'; ++i)
{
if(++Color > 15)
Color = 1;
SetTextColor(Color);
std::cout << text[i];
}
}
void CONSOLE::Pause(const char *text)
{
if(text != NULL)
std::cout << text << std::endl;
std::cin.clear();
GetKey();
}
void CONSOLE::Beep()
{
printf("\a");
}
void CONSOLE::ClearScreen()
{
#ifdef OS_WIN
system("cls");
#else
/* TODO: LINUX */
#endif
}
void CONSOLE::HideCursor()
{
#ifdef OS_WIN
HANDLE hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO hCCI;
GetConsoleCursorInfo(hConsoleOut, &hCCI);
hCCI.bVisible = FALSE;
SetConsoleCursorInfo(hConsoleOut, &hCCI);
#else
/* TODO: LINUX */
#endif
}
void CONSOLE::ShowCursor()
{
#ifdef OS_WIN
HANDLE hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO hCCI;
GetConsoleCursorInfo(hConsoleOut, &hCCI);
if (hCCI.bVisible != TRUE)
{
hCCI.bVisible = TRUE;
SetConsoleCursorInfo(hConsoleOut, &hCCI);
}
#else
/* TODO: LINUX */
#endif
}
char CONSOLE::GetKey()
{
return _getch();
}
bool CONSOLE::IsKeyPressed()
{
return _kbhit();
}
void CONSOLE::Sleep(int ms)
{
/* TODO: SLEEP ON TIMERS */
}
void CONSOLE::MenuCreate(const char text[], int x, int y, int Color)
{
if(IsMenuExists)
{
ErrorsTable.push_back(CONSOLE::Errors::MENU_ALREADY_CREATED);
return;
}
IsMenuExists = true;
MenuCaption.Name = text;
MenuCaption.x = x;
MenuCaption.y = y;
MenuCaptionColor = Color;
}
void CONSOLE::MenuSelectByColor(int Color_True, int Color_False)
{
SelectByColor = true;
Sel_Col_True = Color_True;
Sel_Col_False = Color_False;
}
void CONSOLE::MenuSelectBySign(char Sign, bool Is_On_Left, int Color)
{
SelectByColor = false;
Sel_Left = Is_On_Left;
Sel_Sign = Sign;
SelectBySignColor = Color;
}
void CONSOLE::MenuLoop(char Up, char Down, char Select, CONSOLE::VoidFunction AdditionalFunc)
{
if(!IsMenuExists)
{
ErrorsTable.push_back(CONSOLE::Errors::MENU_NOT_CREATED);
return;
}
char Key;
int Size = MenuItems.size();
int SelPos = -1;
auto Counter = [&SelPos, &Size]() {
if(SelPos == Size)
SelPos = 0;
if(SelPos < 0)
SelPos = Size-1;
};
do {
do {
Key = 0;
Counter();
AdditionalFunc();
SetTextColor(MenuCaptionColor);
WriteXY(MenuCaption.Name, MenuCaption.x, MenuCaption.y);
if(!SelectByColor)
for(unsigned i = 0; i < MenuItems.size(); ++i)
if(Sel_Left)
WriteXY(' ', MenuItems[i].x-1, MenuItems[i].y);
else
WriteXY(' ', MenuItems[i].x + MenuItems[i].Name.size(), MenuItems[i].y);
for(unsigned i = 0; i < MenuItems.size(); ++i)
{
if(SelectByColor)
{
if(SelPos == i)
SetTextColor(Sel_Col_True);
else
SetTextColor(Sel_Col_False);
}
if(!SelectByColor)
SetTextColor(SelectBySignColor);
WriteXY(MenuItems[i].Name, MenuItems[i].x, MenuItems[i].y);
if(!SelectByColor)
{
if(Sel_Left)
WriteXY(Sel_Sign, MenuItems[SelPos].x-1, MenuItems[SelPos].y);
else
WriteXY(Sel_Sign, MenuItems[SelPos].x + MenuItems[SelPos].Name.size(), MenuItems[SelPos].y);
}
}
if(IsKeyPressed())
Key = GetKey();
if(Key == Up)
--SelPos;
if(Key == Down)
++SelPos;
} while (Key != Select);
} while(MenuItems[SelPos].Func(MenuItems[SelPos].x, MenuItems[SelPos].y) == false);
}
void CONSOLE::MenuAddItem(const char text[], int x, int y, CONSOLE::BoolFunctionIntRIntR Func)
{
if(!IsMenuExists)
{
ErrorsTable.push_back(CONSOLE::Errors::MENU_NOT_CREATED);
return;
}
MenuItems.push_back(_CON_::MENUITEM(text, MenuCaption.x+x, MenuCaption.y+y, Func));
}
void CONSOLE::MenuDestroy()
{
if(!IsMenuExists)
{
ErrorsTable.push_back(CONSOLE::Errors::MENU_NOT_CREATED);
return;
}
IsMenuExists = false;
MenuItems.clear();
}
int CONSOLE::GetLastError()
{
if(ErrorsTable.size() == 0)
return Errors::NOTHING;
int i = ErrorsTable[ErrorsTable.size()-1];
ErrorsTable.erase(ErrorsTable.end()-1);
return i;
}
#endif |
Program przykładowy:
Kod: | #include "Console.hpp"
void ToCoJestCalyCzasWPetliRysowane()
{
Console.GotoXY(50, 3);
Console.SetTextColor(CONSOLE::Colors::BLUE);
Console << "By: ";
Console.SetTextColor(CONSOLE::Colors::MAGNETA);
Console << "spartanPAGE ";
Console.SetTextColor(CONSOLE::Colors::BLUE);
Console << ":*";
}
int main()
{
Console.MenuCreate("PRZYKLADOWE MENU (3, 3)", 3, 3, CONSOLE::Colors::RED);
Console.MenuSelectByColor(CONSOLE::Colors::WHITE, CONSOLE::Colors::GREEN);
Console.MenuAddItem("Teczowy tekst", 1, 3, [](int &x, int &y)->bool {
Console.GotoXY(x+20, y);
Console.WriteRainbow("*TEN TEKST EMANUJE TECZA, BO JEST BARDZO KOLOROWY*");
return false;
});
Console.MenuAddItem("Beepniecie", 2, 4, [](int &x, int &y)->bool {
Console.SetTextColor(CONSOLE::Colors::CYAN);
Console.WriteXY("to nie zawsze dziala, ale powinno beepnac. ", x+20, y);
Console.Beep();
return false;
});
Console.MenuAddItem("Czyszczenie ekranu", 3, 5, [](int &x, int &y)->bool {
Console.ClearScreen();
return false;
});
Console.MenuAddItem("Pauza z wlasnym tekstem", 4, 6, [](int &x, int &y)->bool {
Console.GotoXY(20, 20);
Console.Pause("...Wlasny tekst...");
return false;
});
Console.MenuAddItem("Schowaj kursor konsoli", 4, 7, [](int &x, int &y)->bool {
Console.HideCursor();
return false;
});
Console.MenuAddItem("Pokaz kursor konsoli", 4, 8, [](int &x, int &y)->bool {
Console.ShowCursor();
return false;
});
Console.MenuAddItem("test IsKeyPressed i GetKey", 3, 9, [](int &x, int &y)->bool {
Console.GotoXY(0, 0);
if(Console.IsKeyPressed())
Console << "Bez zatrzymywania programu, moge stwierdzic, ze wcisnales klawisz " << Console.GetKey();
else
Console << "Gdy tu dotarles, zadnego przycisku nie wcisnales... ";
return false;
});
Console.MenuAddItem("Przeciazenie << oraz >>", 2, 10, [](int &x, int &y)->bool {
Console.GotoXY(0, 17);
Console << "Podaj liczbe, a ja napisze kwadrat: ";
static long long i;
Console >> i;
Console << "-> " << i*i;
return false;
});
Console.MenuAddItem("Wyjscie", 1, 11, [](int &x, int &y)->bool {
return true;
});
Console.MenuLoop('w', 's', 13 /*enter*/, ToCoJestCalyCzasWPetliRysowane);
Console.MenuDestroy();
Console.ClearScreen();
Console.Pause();
return 0;
} |
Screeny z programu przykładowego:
Link do programu przykładowego:
http://www.mediafire.com/?5j9nz51dk2pqp6y |
________________________
Programowanie jest moją pasją. Programuję w C, C++, C#, Javie i Delphi. Jeśli czegoś porzebujesz (związanego z tymi językami), śmiało możesz pisać na PW. |
|