Pers.narod.ru. Алгоритмы. Простейшее меню и окно вывода для консоли C++ (функции библиотеки conio.h) |
Несмотря на то, что в моих архивах со старыми программами на Си можно найти исходники консольных и графических интерфейсов до- или вне-визуальной эпохи, применять их сегодня для простых учебных задач было бы слишком трудоёмко.
Но консольный C++ по-прежнему изучается до современных графических интерфейсов и компонентов (знание конкретных особенностей которых, к тому же, почти ничего не добавляет к Вашему мастерству программиста), а обходиться одной командной строкой как-то не хочется.
Ниже показана простейшая процедурная программка, способная формировать и поддерживать одноуровневое горизонтальное или вертикальное меню. Для создания меню достаточно описать в главной программе 2 структуры:
ITEM описывает набор пунктов меню, для каждого указывается
столбец (1-80) и строка (1-25) для вывода в окне консоли, наименование пункта, имя
функции типа void имя(void), являющейся обработчиком пункта:
typedef void (* FUN) (void);
//Указатель на функцию void функция(void) - они будут выполнять пункты меню
typedef struct ITEM { //Структура для элемента меню
int x,y; //Столбец и строка консоли, куда выводим строку меню
char *str; //Наименование пункта меню
FUN f; //Функция, привязанная к пункту меню
};
//...
ITEM menu1[3]={ //Описали меню
{2,2,"File",File},
{2,3,"Do",Do},
{2,4,"Exit",Exit}
};WINDOW описывает координаты левого верхнего и правого нижнего углов окна консоли, в котором функции обработки пунктов меню могут печатать текст (оператором cprintf) или ожидать ввода данных (функциями cscanf или cgets), а также цвет фона и текста в окне:
typedef struct WINDOW { //Окно вывода для всех функций
int x1,y1,x2,y2,back,color; //Координаты двух углов, фоновый цвет, цвет вывода
};
//...
WINDOW w={3,3,77,23,BLUE,YELLOW}; //Описали окно вывода функций
Следует учесть, что передаваемые координаты соответствуют
области вывода
в консоли, а рамка окна будет нарисована в границах (x1-1,y1-1,x2+1,y2+1).
После этого всё, что остаётся - вызвать функцию DrawMenu, передав ей размерность меню, указатель на массив структур типа ITEM и структуру WINDOW.
DrawMenu (3,menu1,w); //Вызвали главную функцию системы
Остальные функции - служебные. Для очистки буфера клавиатуры использована небольшая ассемблерная вставка,
как мне помнится, fflush (stdin); для этой цели работает не везде и не всегда.
Вот скриншот примера:

Пример для вертикального меню вместо горизонтального закомментарен в листинге.
Файл ниже прикреплён в оригинальной для консольных C++ кодировке DOS, так как рамки рисуются символами псевдографики, которых в Windows-кодировках попросту нет.
Простое консольное меню на функциях библиотеки conio.h, файл .cpp (4 Кб)
|
|