Навигация по меню с помощью клавиш - C (СИ)
Формулировка задачи:
Появился вопрос,как сделать в си чтобы в консольном окне( В черненьком)) ) по меню можно было двигаться с помощью нажатых клавиш вверх и вниз,с соответствующим цветом на котором остановились
Чтобы например как в ниже примере надо было не выбирать пункт нажатием 1 или 2..... или 6 чтоб выйти а двигаться
Как это реализовать? надеюсь поняли что я хотел спросить
с помощью стрелок вверх и вниз по меню
соответственно не будет тогда строки ваш вариант,просто нужный например пункт выбрал и нажал ентер и выполняется например если на 2 остановились нажали ентер там идет дальще вычисление#include <stdio.h> #include <conio.h> int main() { int a; while(true) { printf("1.Sozdat"); printf("\n2.Dobavit"); printf("\n3.Udalit"); printf("\n4.Naiti"); printf("\n5.Zapisat v fail"); printf("\n6.Exit"); printf("\n\nVash variant: "); scanf("%i",&a); if(a==1) { // код какой нить } //..................... if(a==6) { break; } } return 0; }
Решение задачи: «Навигация по меню с помощью клавиш»
textual
Листинг программы
#include <windows.h> #include <stdio.h> void ShowMenu(int iItem) { system("cls"); printf("%s1 - 1-st item\n",iItem == 1 ? ">" : " "); printf("%s2 - 2-nd item\n",iItem == 2 ? ">" : " "); printf("%s3 - 3-rd item\n",iItem == 3 ? ">" : " "); printf("%s4 - 4-th item\n",iItem == 4 ? ">" : " "); printf("%s5 - 5-th item\n",iItem == 5 ? ">" : " "); } int main() { int iItem = 1;//Отвечает какой пункт меню активен в данный момент int nLast = 5;//Отвечает какой индекс у последнего пункта меню ShowMenu(iItem); while(TRUE) { if(GetAsyncKeyState(VK_UP)) { keybd_event(VK_UP, 0, KEYEVENTF_KEYUP, 0);//Отжимаем кнопку if(0 < iItem - 1) iItem = iItem - 1; else iItem = nLast; ShowMenu(iItem); } if(GetAsyncKeyState(VK_DOWN)) { keybd_event(VK_DOWN, 0, KEYEVENTF_KEYUP, 0);//Отжимаем кнопку if(iItem < nLast) iItem = iItem + 1; else iItem = 1; ShowMenu(iItem); } if(GetAsyncKeyState(VK_RETURN)) { keybd_event(VK_DOWN, 0, KEYEVENTF_KEYUP, 0);//Отжимаем кнопку ShowMenu(iItem); switch(iItem) { case 1: printf("Run 1-st item of menu\n"); break; case 2: printf("Run 2-nd item of menu\n"); break; case 3: printf("Run 3-rd item of menu\n"); break; case 4: printf("Run 4-th item of menu\n"); break; case 5: printf("Run 5-th item of menu\n"); break; } } } return 0; }
Объяснение кода листинга программы
- Программа включает два заголовочных файла:
и . - Функция ShowMenu() выводит на экран меню с пятью пунктами.
- Переменная iItem отвечает за выбор текущего пункта меню, а nLast — за последний пункт меню.
- В основном цикле программы с помощью функций GetAsyncKeyState() и keybd_event() обрабатываются нажатия клавиш
вверх
ивниз
. - Если нажата клавиша
вверх
, то текущий пункт меню делается неактивным и выбирается предыдущий пункт меню или, если его нет, то последний пункт меню. - Если нажата клавиша
вниз
, то текущий пункт меню делается неактивным и выбирается следующий пункт меню или, если его нет, то первый пункт меню. - Если нажата клавиша
Enter
, то выполняется соответствующий пункт меню:- При выборе первого пункта меню выводится сообщение
Run 1-st item of menu
. - При выборе второго пункта меню выводится сообщение
Run 2-nd item of menu
. - При выборе третьего пункта меню выводится сообщение
Run 3-rd item of menu
. - При выборе четвёртого пункта меню выводится сообщение
Run 4-th item of menu
. - При выборе пятого пункта меню выводится сообщение
Run 5-th item of menu
.
- При выборе первого пункта меню выводится сообщение