Консультация № 115742
24.12.2007, 15:03
0.00 руб.
0 1 1
Уважаемые эксперты. Подскажите пожалуйста что нужно сделать (какой написать код) для того чтобы при нажитии какой-либо клавиши (например Esc) консольное приложение закрывалось. То есть сделать
что-то вроде меню. в котором при нажатии клавиши Esc. программа
прекращает работу. Заранее благодарен.

Обсуждение

Неизвестный
24.12.2007, 19:54
общий
это ответ
Здравствуйте, Мокренко Игорь Юрьевич!

Простейший вариант - использовать функцию getch() (определена в файле conio.h) и отслеживать значения, которые она возвращает (esc соответствует код 27).

Пример создания текстовых менюшек с ее использованием - в приложении.

Приложение:
#include <map>#include <string>#include <iostream>using namespace std;#include <conio.h>class CTextMenu{public: CTextMenu(const string& name) :MenuName(name) {}public: void AddItem (unsigned int nItem,const char * desc,CTextMenu& submenu); void AddItem (unsigned int nItem,const char * desc,void (* handler)()); void MainLoop(); private: void DrawMenu();private: struct Item { string description; CTextMenu * submenu; void (* handler)(); Item() {} Item(const char* desc,CTextMenu* _submenu,void (* _handler)()) :submenu(_submenu) ,handler(_handler) { description = desc; } }; map <int,Item> AllItems; string MenuName;};void CTextMenu::AddItem(unsigned int nItem, const char *desc, CTextMenu &submenu){ AllItems[nItem] = Item(desc,&submenu,0);}void CTextMenu::AddItem(unsigned int nItem, const char *desc, void (*handler)()){ AllItems[nItem] = Item(desc,0,handler);}void CTextMenu::DrawMenu(){ system("cls"); cout << MenuName << endl << endl; for (map <int,Item>::iterator i = AllItems.begin(); i != AllItems.end(); ++i) { cout << i->first << "." << i->second.description << endl; } cout << endl;}void CTextMenu::MainLoop(){ DrawMenu(); int choice = 0; while (choice != 27) //while not esc { choice = getch(); map <int,Item>::iterator it = AllItems.find(choice - ‘0‘); if (it != AllItems.end()) { if (it->second.submenu) it->second.submenu->MainLoop(); else if (it->second.handler) (*it->second.handler)(); DrawMenu(); } }}void Item1_handler(){ cout << "I‘m Item1 handler" << endl; getch();}void Item2_handler(){ cout << "I‘m Item2 handler" << endl; getch();}void main(){ CTextMenu MainMenu("Menu name"); MainMenu.AddItem(1,"Item 1",Item1_handler); MainMenu.AddItem(2,"Item 2",Item2_handler); CTextMenu SubMenu1("Submenu1"); CTextMenu SubMenu2("Submenu2"); SubMenu1.AddItem(1,"Submenu2",SubMenu2); MainMenu.AddItem(3,"Submenu1",SubMenu1); MainMenu.MainLoop();}
Форма ответа