КАК создаются меню в DOS?

КАК применяются меню?
КАК создать меню проще всего и быстрее всего?
КАК украсить простое меню?
КАК создать полноценное цветное меню с планочкой-указателем?

Вопрос: КАК применяются меню?

В настоящее время работа без меню немыслима. Начиная с Windows 3.11 и заканчивая последними графическими и текстовыми редакторами, меню имеет каждая программа, даже та, которая могла бы без него и обойтись. По правилам хорошего тона, пользователь должен иметь возможность получить доступ к функциям программы как через панель управления, так и через меню. Меню - это удобно. Mеню позволяет быстро получить то, что тебе нужно, а заодно познакомиться с тем, что умеет программа.
Но мало кто теперь помнит, какие были первые текстовые меню в таких программах, как: Norton Commander, Dos Navigator, а также множестве других прикладных программ выполненных в текстовом режиме. Цветное окошко, а в нём список, состоящий из нескольких пунктов.

Пример программы, написанной на Turbo Vision

Нажимая клаивши "Вверх-вниз", вы перемещаетесь по пунктам цветной планочкой. Выбрав пункт, вы нажимали "ENTER". В своё время текстовые окна, кнопки и элементы управления были так популярны, что компанией Borland была разработана настоящая библиотека классов Turbo Vision, которая какое-то время успешно использовалась. С Windows она конечно конкурировать уже не смогла... Тем не менее во многих прикладных программах, (особенно учебных), требуется меню. Есть несколько способов задать меню. Мы их рассмотрим.



КАК создать меню проще всего и быстрее всего?

Способ 1
Вы просто перечисляете на экране список пунктов. Пользователь нажмёт соответствующую цифру и тем самым выберет меню. Обработчик нажатия кнопки строится с помощью switch/case. Если пользователь нажимает не то, можно осадить его противным писком.

#include<stdio.h>
#include<conio.h>

//Вывод текстового сообщения в конкретное место экрана
void print(int x, int y, char *str)
{
gotoxy(x,y);
cprintf(str);
}
void main()
{
clrscr();
textcolor(2); //цвет текста - зелёный

print(25,13,"1. Ввод данных");
print(25,14,"2. Чтение данных");
print(25,15,"3. Поиск данных");
print(25,16,"4. Удаление данных");
print(25,17,"5. Выход");
gotoxy(25,19);_setcursortype(1); //сделаем мигающий кусор - типа "ожидание".
getch(); //здесь надо разместить do/while, где пользователь вводит цифру. Потренеруйтесь!

}

Вопрос: КАК украсить простое меню?

Способ 2. Выводим то же самое, но появляется рамка.
С помощью символов псевдографики мы рисуем рамку вокруг текста:

================
|| 1. Ввод текста   ||  
|| 2. Вывод данных ||   
|| 3. Выход              ||   
================


Так будет немного веселее ;-)


Символы псевдографики отсутствуют в обычной клавиатуре, но получить их можно, используя таблицу ASCII-кодов, где каждому символу соответствует номер. Так, например, вы можете вывести символы корня, степени, сердечки, карточные символы (пики, трефы, бубны и черви), символ параграфа и конечно все остальные символы, буквы и цифры. Вывести их просто. Зажав кнопку ALT, вы набираете номер символа на дополнительной клавиатуре. Отпустив ALT, вы увидите его на экране. Нажмите ALT и наберите: "186". Отпустив ALT, вы увидите: "¬"- это правый угол рамки. Используя символы под другими цифрами, вы сможете нарисовать отличную рамку вокруг своего меню, примерно так, как показано на рисунке.


Вопрос: КАК создать полноценное цветное меню с планочкой-указателем?

Способ 3. Добавим вашу любимую планочку. Приготовьтесь, будет сложно. Эта программа гораздо сложнее всех предыдущих, потому что она реально работает. Сразу разобраться в таком большом чужом коде сложно. Попробуйте разбирать её по частям.

#include<stdio.h>
#include<conio.h>
#include<process.h>

//Функция выводит на экран строку в нужном месте
void print(int x, int y, char *str)
{
gotoxy(x,y);
cprintf(str);
}
//Рисует на экране наше меню, используя предыдущую функцию
void menu()
{
print(25,13,"1. Ввод данных");
print(25,14,"2. Чтение данных");
print(25,15,"3. Поиск данных");
print(25,16,"4. Удаление данных");
print(25,17,"5. Выход");
}


//Рисует планочку. x, y -координаты, color - цвет планочки, tcolor - цвет выделенного текста, str - сам текст
void block(int x, int y, int color, int tcolor, char *str)
{
textcolor(tcolor);
textbackground(color);
print(x,y,str);
}
void main()
{
int key; //код нажатой клавиши
int color=15; //цвет планки по умолчанию
int pos; //позиция планки

//строковый массив с названиями строк меню
char *mas[5]={
"1. Ввод данных",
"2. Чтение данных",
"3. Поиск данных",
"4. Удаление данных",
"5. Выход"
};//очистили экран
clrscr();
//вывели меню
menu();

//установили планку на первую строку
block(25,13,color, 4, mas[0]);

//начальная позиция планки = 0
pos=0;

//Цикл обработки нажатия клавиши - пока не нажмёшь Esc
do {
key=getch(); //Получим код клавиши

//Запомнили этот код
switch(key) {

//Если была нажата стрелка вниз
case 80:{
if (pos<4) //Если пункт не последний
{
pos++; //Спускаемся ниже
block(25, 13+pos-1, 0, 7, mas[pos-1]); //Восстанавливаем предыдущее местоположение в нормальный незакрашенный вид
block(25, 13+pos, color, 4, mas[pos]); //Закрашиваем планочкой новое место
}
else //Если пункт меню последний,
{
block(25, 13+pos, 0, 7, mas[pos]); //Восстанавливаем его
pos=0; //И переходим опять на первый
block(25, 13+pos, color, 4, mas[pos]); //Закрашиваем его
}
break;
};

//Если стрелка вверх

case 72:{ //аналогично стрелке вниз.
if (pos>0)
{
pos--;
block(25, 13+pos+1, 0, 7, mas[pos+1]);
block(25, 13+pos, color, 4, mas[pos]);
}
else
{
block(25, 13+pos, 0, 7, mas[pos]);
pos=4;
block(25, 13+pos, color, 4, mas[pos]);
} //Если Enter
case 13: {
//Запоминаем на каком пункте она была нажата
switch(pos){
//Если пункт меню был "Выход",

case 4: exit(1); //Выйти из программы
}

}
};
}}while(key!=27); //Пока не нажмёшь Esc

}

Кроме выхода, вы можете вставить свои процедуры и на другие строки, чтобы выполнялось что-то ещё на каждом пункте. Более сложные программы вмещают несколько меню, вложенные меню и контекстные меню. Делать их сейчас под DOS не станет даже опытный программист. Часто в университетах по предмету "Прикладное программирование" задают сделать математическую программу, которая считает ряд, дифур или интеграл. Для неё надо предусмотреть дружественный интерфейс (читай: "меню"), таблицу со значениями и график. Считайте, что с первым пунктом вы справились. Остальному тоже научу, но позже.


Назад Содержание Вперёд