Ogłoszenie 

Uwaga! To forum jest w trybie offline.
Wszelką pomoc uzyskasz pod adresem
forum.ultimateam.pl


Administracja Forum


Poprzedni temat «» Następny temat
SHEC, C++
Autor Wiadomość
spartanPAGE 




Pomógł: 12 razy
Dołączył: 07 Gru 2011
Posty: 103
Skąd: Hellada
Wysłany: Sob 27 Kwi, 2013 14: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:
Spoiler:


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.
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group | Template Klam by Ayene