#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:";
}
оригинальное меню в консоли C++
Доброго вечера, помогите разобраться с некоторым кодом, в котором содержится интересное консольное меню с помощью goto xy. Искал в нэте материал по этому но ничего не нашел((. Хотелось бы научиться самому создавать такое меню с нуля, и разобраться как реализовать передвижение стрелочками по пунктам а так же выход при нажатии Esc. Ну и еще в добавок интересует то, как здесь задавались цвета. В этом коде просто много мусора, и он не рабочий, но сама меню рабочая. Программированием занялся недавно, благодарю заранее за помощь.
Код:
#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();
}
#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();
}