Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/154: Рейтинг темы: голосов - 154, средняя оценка - 4.88
130 / 117 / 30
Регистрация: 14.11.2010
Сообщений: 707
1

Меню в консоли

04.01.2011, 11:30. Показов 31918. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
есть код для менюшки, по идее при нажатии стрелок вверх или вниз, должен передвигаться флажок
-> , но почему то не передвигается, остается н первом пункте...
пишу в Borland Developer Studio 2006
подскажите в чем дело...

C++
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
#include <iostream>
#include <conio.h>
#include <windows.h>
using namespace std;
int menu();
int main()
{
 
        int answer=menu();
    switch (answer)
        {
                case 0: cout<<"1"<<endl;break;
                case 1: cout<<"2"<<endl;break;
                case 2: cout<<"3"<<endl;break;
                case 3: cout<<"4"<<endl;return 0;
    }
        system("pause");
        return 0;
}
 
int menu() {
        int key=0; 
        int code;  
        do {
                system("cls");  
                key=(key+4)%4;  
                if (key==0) cout<<"-> Privet +1"<<endl;
                        else  cout<<"   Privet +1"<<endl;
 
                if (key==1) cout<<"-> Privet +2"<<endl;
                        else  cout<<"   Privet +2"<<endl;
 
                if (key==2) cout<<"-> Privet +3"<<endl;
                        else  cout<<"   Privet +3"<<endl;
 
                if (key==3) cout<<"-> Privet +4"<<endl;
                        else  cout<<"   Privet +4"<<endl;
                        
                code=getch();
                if (code==224)
                                {
                                        code=getch();
                                        if (code==80) key++; 
                                        if (code==72) key--; 
                        }
           }while(code!=13); 
                system("cls");  
        return key; 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.01.2011, 11:30
Ответы с готовыми решениями:

Меню в консоли
Здравствуйте! У меня есть класс с реализованным меню, вот код: /// &lt;summary&gt; ///...

Меню в консоли
По условию нужно сделать что-то вроде меню в консоли. Чисто теоретически порядок знаю, но с...

Меню в консоли
Меня интересует вот что: зачем в функции int menu(); вот это условие code=getch(); ...

Меню в консоли
namespace ConsoleApplication3 { class Program { static void Main(string args) ...

15
130 / 117 / 30
Регистрация: 14.11.2010
Сообщений: 707
05.01.2011, 18:56  [ТС] 2
исправил, нужно не if (code==224), а if (code==0)
C++
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
#include <iostream>
#include <conio.h>
#include <windows.h>
using namespace std;
int menu();
int main()
{
 
                int answer=menu();
    switch (answer)
                {
                        case 0: cout<<"1"<<endl;break;
                                case 1: cout<<"2"<<endl;break;
                                case 2: cout<<"3"<<endl;break;
                                case 3: cout<<"4"<<endl;return 0;
        }
                system("pause");
                return 0;
}
 
int menu() {
        int key=0; 
        int code;  
        do {
                system("cls");  
                key=(key+4)%4;  
                                if (key==0) cout<<"-> Privet +1"<<endl;
                                                else  cout<<"   Privet +1"<<endl;
 
                                if (key==1) cout<<"-> Privet +2"<<endl;
                                                else  cout<<"   Privet +2"<<endl;
 
                                if (key==2) cout<<"-> Privet +3"<<endl;
                                                else  cout<<"   Privet +3"<<endl;
 
                                if (key==3) cout<<"-> Privet +4"<<endl;
                                                else  cout<<"   Privet +4"<<endl;
                                                
                                code=getch();
                if (code==0)
                                {
                                        code=getch();
                                        if (code==80) key++; 
                                        if (code==72) key--; 
                        }
           }while(code!=13); 
                system("cls");  
        return key; 
}
2
3 / 3 / 0
Регистрация: 02.09.2011
Сообщений: 107
02.09.2011, 15:33 3
Илья помоги плиз у меня что то не переходит курсор по выбору стрелками почему?

Добавлено через 15 минут
key=(key+4)%4; объясни пожалуйста этот момент кода чайнику
0
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
02.09.2011, 23:45 4
Лучший ответ Сообщение было отмечено как решение

Решение

Вот меню накидал, только для Windows.
C++
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <windows.h>
#include <shellapi.h>
#define  FOCUS_COLOR  10u   // цвет текста при фокусе комманды меню
#define  STATE_COLOR  14u   // цвет не выделенных комманд меню
#define  MENU_POS_X   14    // начальная позиция меню по-X
#define  MENU_POS_Y   2     // начальная позиция меню по-Y
 
CONSOLE_SCREEN_BUFFER_INFO    ginfo;
HANDLE   gout;
 
char* conv_cp(const char* str, char* buf);
void  additem(const char*  str, WORD color, short& top);
void  set_cursor(char ch, WORD color, WORD focus, short cursor);
void  run_command(short cursor);
void  navigate(short& cursor, short size, short num);
 
 
int  main(void) {
 
     char buf[255];
     CONSOLE_CURSOR_INFO  icur;
     short  posY   = MENU_POS_Y;
     short  cursor = MENU_POS_Y;
 
     gout = GetStdHandle(STD_OUTPUT_HANDLE);
 
     ZeroMemory(&ginfo, sizeof(CONSOLE_SCREEN_BUFFER_INFO));
     GetConsoleScreenBufferInfo(gout, &ginfo);
 
     icur.bVisible = FALSE;
     icur.dwSize   = 1u;
     SetConsoleCursorInfo(gout, &icur);  // убрать курсор из консоля
 
     // строим список комманд меню
     additem(conv_cp("Показать Мой компьютер", buf), STATE_COLOR, posY);
     additem(conv_cp("Запустить калькулятор", buf), STATE_COLOR, posY);
     additem(conv_cp("Открыть страничку www.cyberforum.ru", buf), STATE_COLOR, posY);
     additem(conv_cp("Отправить e-mail", buf), STATE_COLOR, posY);
     additem(conv_cp("Закрыть консоль", buf), STATE_COLOR, posY);
 
     conv_cp("Навигация по меню клавиши вверх и вниз, enter.", buf);
     WriteConsoleA(gout, buf, strlen(buf), &icur.dwSize, NULL); 
 
     set_cursor('>', 12u, FOCUS_COLOR, cursor);
     while(1) {
            if(GetAsyncKeyState(VK_DOWN))   // переместиться вниз
                   navigate(cursor, posY, 1);
 
            if(GetAsyncKeyState(VK_UP))  // переместиться вверх
                   navigate(cursor, posY,-1);
            if(GetAsyncKeyState(VK_RETURN))  // на клавишу Enter исполняются комманды
                  run_command(cursor);
     }
     return 0;
}
 
 
// конвертирование в родную консольную кодировку OEM
char*  conv_cp(const char* str, char* buf) {
    CharToOemA(str, buf);
    return buf;
}; 
 
// добавить комманду в меню
void  additem(const char*  str, WORD color, short& top) {
    DWORD dw  = 0u;
    COORD pos  = { MENU_POS_X, top };
 
    WriteConsoleOutputCharacterA(gout, str, strlen(str), pos, &dw);
    for(; *str; *str++, pos.X++ ) 
          WriteConsoleOutputAttribute(gout, &color, 1, pos, &dw);
    top++;
}
 
// ролловеры - эфекты 
void  set_cursor(char ch, WORD color, WORD focus, short cursor) {
    DWORD dw  = 0u;
    COORD pos = { MENU_POS_X - 1, cursor };
    FillConsoleOutputCharacterA(gout, ch,    1u, pos, &dw);
    FillConsoleOutputAttribute(gout, color, 1u, pos, &dw);
    pos.X++;
    FillConsoleOutputAttribute(gout, focus, 64u, pos, NULL);
}
 
// список комманд - меню
void  run_command(short cursor) {
    switch(cursor - MENU_POS_Y) {
            case 0:  
        WinExec("explorer.exe", SW_SHOWDEFAULT);
        break;
    case 1:  
        WinExec("calc.exe", SW_SHOW);
        break;
    case 2:  
                         ShellExecuteA(GetForegroundWindow(), "open", 
        "https://www.cyberforum.ru/", "", "", SW_SHOWDEFAULT);
        break;
    case 3: 
                         ShellExecuteA(GetForegroundWindow(), "open", 
        "mailto:example@mail.ru?subject=Привет от xAtom !", "", "", SW_SHOWDEFAULT);
        break;
    case 4:  
                         TerminateProcess(GetCurrentProcess(), 0u);
        break;
    }
    Sleep(400u);
}
 
// навигация по списку меню
void  navigate(short& cursor, short size, short num) {
   if(cursor <= MENU_POS_Y && num < 0 || cursor >= size - 1 && num > 0)
         return;
   set_cursor(' ', 12u, STATE_COLOR, cursor);
   cursor += num;
   set_cursor('>', 12u, FOCUS_COLOR, cursor);
   Sleep(400u);
}
Внизу скриншотик.
Миниатюры
Меню в консоли  
4
3 / 3 / 0
Регистрация: 02.09.2011
Сообщений: 107
05.09.2011, 11:53 5
Спасибо за помощь
0
3 / 3 / 0
Регистрация: 02.09.2011
Сообщений: 107
05.09.2011, 12:08 6
Почему у меня ошибка
сижу под админом в Windows7 studio10
Миниатюры
Меню в консоли  
0
Заблокирован
Автор FAQ
05.09.2011, 16:43 7
Цитата Сообщение от SpiritAT Посмотреть сообщение
в Windows7 studio10
- 10-ка полна "приятных сюрпризов", как вариант прокола при написании - неправельные настройки проекта, вместо консоли выбрал CLR, стиль заголовков старый, вместо cout нужно std::cout до этого нужно указать using namespace std.
PS:Привёл список неприятностей, которые испытаваю сам, мучительно переходя с 6-ки(98 года) на 10-ку
1
3 / 3 / 0
Регистрация: 02.09.2011
Сообщений: 107
05.09.2011, 16:46 8
Спасибо учту )))
0
1 / 1 / 0
Регистрация: 15.01.2011
Сообщений: 132
05.09.2011, 17:53 9
Попробовал эту прогу и у меня виснет а потом ошибку кидает. ну и русский как всега не понятный.
0
Freelance
Эксперт С++
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
05.09.2011, 18:28 10
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
вместо cout нужно std::cout до этого нужно указать using namespace std
Это не "приятный сюрприз", это - поведение, которе соответствует стандарту языка.
0
Заблокирован
Автор FAQ
05.09.2011, 19:53 11
Цитата Сообщение от asics Посмотреть сообщение
Это не "приятный сюрприз", это - поведение, которе соответствует стандарту языка.
- XP - наиболее успешная из всех операционок Microsoft-a написана именно с использованием "достандартных" принципов, а ведь почти каждый учился пользоваться компьютером именно на XP и лишь потом дозревал до яблок, пингвинов и прочего.
10-ка на мой взгляд шаг в сторону унитарности, отбрасывания множества до этого успешных конструкций и т.д., в пользу принципа если "не поставите, ваши программы просто в скором будующем не пойдут", где тут прозрачность?А где приемственность - код написанный в ранних версиях воспринимается как сплошная ошибка - это так Microsoft приемтсвенность соблюдает?Хотябы позаботились о трансляторе кода из более ранних в последнюю версию...Я запишу void main() в 98-й скомпилирю и запущу приложение на SP3 уже в 2011 году, и программа отработает на ура, а условия навязываемые производителями - это лишь рамки в которые разработчики пытаются втиснуть программистов (причём не наилучшие рамки)...
PS:Это было лишь моё мнение
0
Freelance
Эксперт С++
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
05.09.2011, 21:11 12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
А где приемственность - код написанный в ранних версиях воспринимается как сплошная ошибка - это так Microsoft приемтсвенность соблюдает?
Этот код, который
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
написанный в ранних версиях
не соответствует стандарту языка, следовательно, никаких притензий к MSVS10 из-за ошибок по нему не должно быть.
0
Заблокирован
Автор FAQ
05.09.2011, 21:19 13
Лучший ответ Сообщение было отмечено как решение

Решение

blackbanny, предлагаю попробовать, вот такое консольное Dos-меню
Управление - кнопками W(вверх) и S(вниз), если нужно выполнить отмеченный пункт меню, то жми Enter (появиться MessageBox, вместо его засвета, вставляй свой код)
C++
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
#include <windows.h>
#include <ctype.h>
#include <stdio.h>
#include <conio.h>
 
#define RED RGB(255,0,0)
#define GRN RGB(0,255,0)
#define BLU RGB(0,0,255)
 
#define BLK RGB(0,0,0)
#define WHT RGB(255,255,255)
 
void DrawMenu(HDC hDC, RECT pRECT, int iSEL, int iTITLE);
 
int main()
{
    int  iSEL  = 0;
    int  nYRes = GetSystemMetrics(SM_CYMENUSIZE)*2;
    bool bMenu = true;
 
    HDC  hDC;
    RECT pRECT;
    
    HWND hWnd  = GetForegroundWindow();
    
    if(hWnd)
    {
        
        if(hDC = GetWindowDC(hWnd))
        {
            SetBkMode(hDC,TRANSPARENT);
            GetClientRect(hWnd,&pRECT);
            while(bMenu)
            {
                DrawMenu(hDC, pRECT, iSEL, nYRes);
                RedrawWindow(hWnd,NULL,NULL,
                    RDW_ERASE|RDW_VALIDATE|RDW_UPDATENOW);
                switch(toupper(getch()))
                {
                case 'W':
                    if((iSEL = iSEL - 1) < 0)
                        iSEL = 4;
                    break;
                case 'S':
                    if(4 < (iSEL = iSEL + 1))
                        iSEL = 0;
                    break;
                case 13:
                    MessageBox(hWnd,"ITEM ->","EXCUTE MENU ITEM",MB_OKCANCEL);
                    break;
                default :
                    bMenu = false;
                    break;
                };
            }
        }
    }
    system("pause");
    return 0;
}
 
void DrawMenu(HDC hDC, RECT pRECT, int iSEL, int iTITLE)
{
     //Толщина заголовка консоли
    char sMENU[] = "***MENU***";
    char *sITEM[] = 
    {
        "ITEM 1",
        "ITEM 2",
        "ITEM 3",
        "ITEM 4",
        "ITEM 5"
    };
    char sARROW[] = " -> ";
    BitBlt(hDC,
        4,iTITLE,
        pRECT.right - pRECT.left,
        pRECT.bottom - pRECT.top,
        hDC,
        4,iTITLE,
        BLACKNESS);
    SetTextColor(hDC,BLU);
    TextOut(hDC,(pRECT.right - pRECT.left)/3,iTITLE,sMENU,strlen(sMENU));
    for(int iITEM = 0; iITEM < 5; iITEM++)
    {
        SetTextColor(hDC,GRN);
        if(iITEM == iSEL)
        {
            SetTextColor(hDC,RED);
            TextOut(hDC, 0,iTITLE + (1 + iITEM)*12,sARROW,strlen(sARROW));
            TextOut(hDC,30,iTITLE + (1 + iITEM)*12,sITEM[iITEM],strlen(sITEM[iITEM]));
        }
        else
            TextOut(hDC,30,iTITLE + (1 + iITEM)*12,sITEM[iITEM],strlen(sITEM[iITEM]));
    }
}
Миниатюры
Меню в консоли  
Вложения
Тип файла: rar DosMenu.exe.rar (13.0 Кб, 266 просмотров)
7
fasked
05.09.2011, 23:14
  #14

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
а ведь почти каждый учился пользоваться компьютером именно на XP и лишь потом
Ну Вы учитывайте поколение то... XP вышла в 2001, а до глубинки докатилась вообще не скоро..
В общем я и не старый, но впервые в жизни увидел 95-ую, а потом долго на 98-ой сидел :D

0
13 / 13 / 1
Регистрация: 31.12.2010
Сообщений: 131
Записей в блоге: 14
10.06.2014, 00:52 15
Мне понравилось, что внизу рамка закрашивается!

Добавлено через 22 минуты
Тебе не сложно по подробнее рассказать -=ЮрА=-, как ты добился такого эффекта? И почему, когда растягиваешь окно - то исчезает закрашивании рамки?
вот упростил код
C++
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
#include <windows.h>
#include <ctype.h>
#include <stdio.h>
#include <conio.h>
 
void DrawMenu(HDC hDC, RECT pRECT, int iSEL, int iTITLE)
{   //Толщина заголовка консоли
    BitBlt(hDC,
        4,iTITLE,
        pRECT.right - pRECT.left,
        pRECT.bottom - pRECT.top,
        hDC,
        4,iTITLE,
        BLACKNESS);
}
int main()
{
    int  iSEL  = 0;
    int  nYRes = GetSystemMetrics(SM_CYMENUSIZE)*2;
    bool bMenu = true;
 
    HDC  hDC;
    RECT pRECT;
 
    HWND hWnd  = GetForegroundWindow();
 
       hDC = GetWindowDC(hWnd);
        {    
            GetClientRect(hWnd,&pRECT);
            while(bMenu)
            {
                        Sleep(40);
                DrawMenu(hDC, pRECT, iSEL, nYRes);
                RedrawWindow(hWnd,NULL,NULL,RDW_ERASE|RDW_VALIDATE|RDW_UPDATENOW);
            }
    }
    return 0;
}
0
Заблокирован
Автор FAQ
11.06.2014, 02:13 16
Цитата Сообщение от fair7 Посмотреть сообщение
И почему, когда растягиваешь окно - то исчезает закрашивании рамки?
Цитата Сообщение от fair7 Посмотреть сообщение
GetClientRect(hWnd,&pRECT);
- получает размеры клиентского прямоугольника на момент вызова функции, у тебя она вызывается всего 1 раз, для начального размера окна, все размеры в последующем просто не закрашиваются через BitBlt

Не по теме:

Цитата Сообщение от fair7 Посмотреть сообщение
вот упростил код
- лучше ничего не упрощать пока досконально не знаешь как что работает

0
11.06.2014, 02:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.06.2014, 02:13
Помогаю со студенческими работами здесь

Меню в консоли c#
Помогите сделать меню в консоли, нужно что было было что то такое: Меню: 1. Ответ на задание №1...

Меню в консоли
Возможно ли реализовать небольшое меню в консоли. Что-то типа такого : 1) Задать значения ...

Меню в консоли
не могу разобраться как сделать рабочее меню в консоли . #include &lt;iostream&gt; using namespace...

Меню на консоли
Здравствуйте! Изучаю C++, для практики ради делаю консольное меню через класс. Может быть мне,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru