Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 52, средняя оценка - 4.98
blackbanny
129 / 116 / 2
Регистрация: 14.11.2010
Сообщений: 707
#1

Меню в консоли - C++

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

есть код для менюшки, по идее при нажатии стрелок вверх или вниз, должен передвигаться флажок
-> , но почему то не передвигается, остается н первом пункте...
пишу в 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2011, 11:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Меню в консоли (C++):

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

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

Меню в консоли - C++
По условию нужно сделать что-то вроде меню в консоли. Чисто теоретически порядок знаю, но с реализацией проблемы((( в while массив из 5...

Работа с меню в консоли - C++
я написал программу #include&lt;iostream.h&gt; #include&lt;conio.h&gt; #include&lt;stdlib.h&gt; #include&lt;iomanip.h&gt; #include&lt;system.hpp&gt; int...

Оригинальное меню в консоли - C++
Доброго вечера, помогите разобраться с некоторым кодом, в котором содержится интересное консольное меню с помощью goto xy. Искал в нэте...

Организация меню в консоли - C++
всем доброе время суток необходимо организованить меню: Для выбора метода вычисления корня уравнения использовать меню, разработанное с...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
blackbanny
129 / 116 / 2
Регистрация: 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
SpiritAT
3 / 3 / 0
Регистрация: 02.09.2011
Сообщений: 107
02.09.2011, 15:33 #3
Илья помоги плиз у меня что то не переходит курсор по выбору стрелками почему?

Добавлено через 15 минут
key=(key+4)%4; объясни пожалуйста этот момент кода чайнику
0
xAtom
915 / 740 / 60
Регистрация: 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", 
        "http://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);
}
Внизу скриншотик.
3
Миниатюры
Меню в консоли  
SpiritAT
3 / 3 / 0
Регистрация: 02.09.2011
Сообщений: 107
05.09.2011, 11:53 #5
Спасибо за помощь
0
SpiritAT
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
SpiritAT
3 / 3 / 0
Регистрация: 02.09.2011
Сообщений: 107
05.09.2011, 16:46 #8
Спасибо учту )))
0
AndreyAndroid
1 / 1 / 0
Регистрация: 15.01.2011
Сообщений: 132
05.09.2011, 17:53 #9
Попробовал эту прогу и у меня виснет а потом ошибку кидает. ну и русский как всега не понятный.
0
asics
Freelance
Эксперт С++
2847 / 1784 / 144
Регистрация: 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
asics
Freelance
Эксперт С++
2847 / 1784 / 144
Регистрация: 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]));
    }
}
7
Миниатюры
Меню в консоли  
Вложения
Тип файла: rar DosMenu.exe.rar (13.0 Кб, 195 просмотров)
fasked
05.09.2011, 23:14
  #14

Не по теме:

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

0
fair7
8 / 8 / 0
Регистрация: 31.12.2010
Сообщений: 81
Записей в блоге: 1
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2014, 00:52
Привет! Вот еще темы с ответами:

Меню в консоли, управление стрелками - C++
Подскажите пожалуйста, как сделать меню типа: пункт 1 пункт 2 и так далее Чтобы между пунктами можно было перемещаться курсором и...

Создать меню настроек в консоли - C++
Доброй ночи В одном из заданий написано: Саму программу я уже написал осталось это меню настроек перед запуском программы. Из...

Меню в консоли - Ввод данных - C++
Доброй ночи Просьба не судить строго мой код - я только учусь! Вот код меню: #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include...

Реализация разветвляющегося меню в консоли - C++
Привет!, Помогите написать код что бы При Нажатие клавиши 1 выполнился код после if (option == 1) #include &lt;iostream&gt; using...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.06.2014, 00:52
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru