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 Кб)
гостевая; E-mail |