Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

оригинальное меню в консоли C++

35K
23 марта 2011 года
life4fun
64 / / 15.11.2010
Доброго вечера, помогите разобраться с некоторым кодом, в котором содержится интересное консольное меню с помощью goto xy. Искал в нэте материал по этому но ничего не нашел((. Хотелось бы научиться самому создавать такое меню с нуля, и разобраться как реализовать передвижение стрелочками по пунктам а так же выход при нажатии Esc. Ну и еще в добавок интересует то, как здесь задавались цвета. В этом коде просто много мусора, и он не рабочий, но сама меню рабочая. Программированием занялся недавно, благодарю заранее за помощь.

Код:
#include <iostream>
#include <conio.h>
#include <ctime>
#include <windows.h>
using namespace std;

void gotoxy(short x, short y) // аналог борландовской gotoxy
    {
    HANDLE StdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD  coord  = {x, y};
    SetConsoleCursorPosition(StdOut, coord);
    }


void oformlenie()
{  
    short x=18,y=4;
    gotoxy(x,y);
    cout<<"*"; //st-up-left
    while (x!= 18+40)
    {  
        x++;
        gotoxy(x,y);
        cout<<"="; //up
    }
    x++;
    gotoxy(x,y);
    cout<<"*"; //st-up-right
    while(y!=17)
    {  
        y++;
        gotoxy(x,y);
        cout<<"\1"; //right
    }
    y++;
    gotoxy(x,y);
    cout<<"*"; //st-bot-right
    while(x!=19)
    {   x--;
        gotoxy(x,y);
        cout<<"="; //bottom
    }
    x--;
    gotoxy(x,y);
    cout<<"*"; //st-bot-left
    while(y!= 5)
    {
        y--;
        gotoxy(x,y);
        cout<<"\1"; //left
    }
}

void color (int c)
    {
    HANDLE StdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(StdOut,c+64);
    }
    void clrscr()
    {
        short x=20,y=6;
        while(y!=18)
        {
            while(x!=58)
            {
                gotoxy(x,y);
                cout<<" ";
                x++;
            }
            y++;
            x=20;
        }
    }

int menu (int i)
    {
    setlocale(LC_CTYPE,"");
    system("cls");
    system("color 3F");
    short x = 20, y = 8;
    if(i==3) y++;
    gotoxy(33,6);
    cout<<"..::MENU::..";
    gotoxy(1,0);
    cout<<"'Esc' - vyiti;   Vybor deistviya: strelkami i klavishei 'Enter';\n Ili je sootvetstvuyushimi ciframi;";
    gotoxy(x,y);
    char *s[3];
    s[0] = "1 - Avtozapolnenie";
    s[1] = "2 - S klaviatury";
    s[2] = "0 - Exit";
    char *p[5];
    p[0] = "1 - Sort obmenom";
    p[1] = "2 - Sort vuborkoi";
    p[2] = "3 - Sort vstavkoi";
    p[3] = "4 - Quick sort";
    p[4] = "0 - Exit";
    m=y;
    for (k=0;k<i;k++)
        {
        if(i == 3)
            {
            cout<<s[k];
            m+=i;
            }
        else
            {
            cout<<p[k];
            m+=2;
            }
    gotoxy(x,m);
    }
    oformlenie();

    gotoxy(x,y);
    //color(11);
    if(i==3)
        cout<<s[0];
    else
        cout<<p[0];
        gotoxy(x,y);
        k=0;
        m=0;
    while(1)
        {
            c = getch();
            switch(c)
            {
                case 48:
                case 27: return 0;
                case 80:
        if(k+1 < i)
        {
            gotoxy(x,y);
            //color(15);
            if(i==3)
            {
            cout<<s[m];
            y+=i;
            }
            else
            {
                cout<<p[m];
                y+=2;
            }
            k++;
            m=k;
            //color(14);
            gotoxy(x,y);
            if (i==3)
            cout<<s[k];
            else cout<<p[k];
            gotoxy(x,y);
        }
        break;
case 72:
        if(k >= 1)
        {
            gotoxy(x,y);
            //color(13);
            if(i==3)
            {
            cout<<s[m];
            y-=i;
            }
            else
            {
                cout<<p[m];
                y-=2;
            }
            k--;
            m=k;
            //color(11);
            gotoxy(x,y);
            if(i==3)
            cout<<s[k];
            else cout<<p[k];
            gotoxy(x,y);
        }
        break;
case 13:
        //color(15);
        if(i==3 && k == 2)
            return 0;
        if(i==5 && k == 4)
            return 0;
        return k+1;
case 49:
    color(15);
    return 1;
case 50:
    color(15);
    return 2;
case 51:
    color(15);
    return 3;
case 52:
    color (15);
    return 4;
}
}
}
int main(void)
{
        m = menu(3);
        if(m == 0)
        return 0;
        clrscr();
        gotoxy(26,10);
        cout<<"Vvedite razmer massiva: ";
        cin>>n;
        if (m == 1)
         {
         }
         else if (m == 2)
         {
           for(i = 0;i<n;i++)
              {
                gotoxy(35,12);
                cout<<"Mas ["<<i<<"] = ";
                cin>>mas;
                gotoxy(35,12);
                cout<<"                ";
             }
         }
            while(1)
           {
        m = menu(5);
        system("cls");
        for(i=0;i<n;i++)
               rabmas = mas;
          if (!m) return 0;
          cout<<"Массив:";

        cout<<"\nOtsortirovannuy massiv:";
}
6.9K
24 марта 2011 года
fen1xxx
63 / / 04.11.2010
Лично я менюшку организовывал таким образом:

Код:
#include <stdio.h> // для printf() и scanf()
#include <conio.h> // для _getch()
#include <windows.h>
HANDLE hConsole, hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

void add()
{return;}// объявляем нужные
void dif()
{return;}// нам функции

int m_pos = 0;          // позиция меню
int max_pos = 3;        // максимальная позиция меню
char s1[101];

enum ConsoleColor
{
    Black         = 0,
    Blue          = 1,
    Green         = 2,
    Cyan          = 3,
    Red           = 4,
    Magenta       = 5,
    Brown         = 6,
    LightGray     = 7,
    DarkGray      = 8,
    LightBlue     = 9,
    LightGreen    = 10,
    LightCyan     = 11,
    LightRed      = 12,
    LightMagenta  = 13,
    Yellow        = 14,
    White         = 15
};

char* ru(char* s) { AnsiToOem(s, s1);   return s1; } // вывод русским языком

void SetColor(int text, int background) // устанавливаем цвет
{
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
}

void GotoXY(int X, int Y) // позиция курсора
{
    COORD coord = { X, Y };
    SetConsoleCursorPosition(hStdOut, coord);
}

void go(int x) // Если нажали Enter
{
    if(x==0) add();
    if(x==1) dif();
    printf(ru("\n   Нажмите любую\n      клавишу"));
    SetColor(0,0);
    GotoXY(35,24);
    exit(0);
}

void choice();

void menu()
{
    system("cls"); // очистить экран
    if(m_pos==0)
    {
        SetColor(6,0); printf(ru(" + Прибавить матрицы\n")); SetColor(15,0);
        printf(ru("   Отнять матрицы\n"));
        printf(ru("   Выход\n"));
        choice();
    }
    if(m_pos==1)
    {
        printf(ru("   Прибавить матрицы\n"));
        SetColor(6,0); printf(ru(" + Отнять матрицы\n")); SetColor(15,0);
        printf(ru("   Выход\n"));
        choice();
    }
    if(m_pos==2)
    {
        printf(ru("   Прибавить матрицы\n"));
        printf(ru("   Отнять матрицы\n"));
        SetColor(6,0); printf(ru(" + Выход\n")); SetColor(15,0);
        choice();
    }
}

void choice() // функция выбора
{
l:
    int ch=_getch(); // считываем значение нажатой клавиши
    if(ch==224) // 224 - это стрелочки
    {
        switch(ch)
        {
        case 80: // вниз
            if(m_pos+1<max_pos) ++m_pos;
            menu();
            break;
        case 72: // вверх
            if(m_pos-1>=0) --m_pos;
            menu();
            break;
        case 13: // Enter
            go(m_pos);
            break;
        default:
            goto l;
        }
    }
    switch(ch)
    {
    case 80: // вниз
        if(m_pos+1<max_pos) ++m_pos;
        menu();
        break;
    case 72: // вверх
        if(m_pos-1>=0) --m_pos;
        menu();
        break;
    case 13: // Enter
        go(m_pos);
        break;
    default:
        goto l;
    }
}

void main()
{
    menu();
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог