Проектирование и реализация интерфейса пользователя (меню на Си)Рефераты >> Программирование и компьютеры >> Проектирование и реализация интерфейса пользователя (меню на Си)
setcolor(GREEN);
for (i=0;i<=textheight("A")+2;i++) // Высота: строка+2 пикс.
line(cur_x-3,i+5,cur_x+textwidth(tmp->GetName())+3,i+5);
setcolor(BLACK);
outtextxy(cur_x,6,tmp->GetName());
// Если пункт открыт, это тоже надо нарисовать
if (tmp->IsOpened()) tmp->GetSub()->paint(cur_x,12+textheight("A"));
}
else outtextxy(cur_x,6,tmp->GetName()); // Выводим обычный пункт
cur_x+=textwidth(tmp->GetName())+18; // Увеличиваем позицию курсора
tmp=tmp->GetNext(); // Берем следующий пункт
}
}
}
Menu* FindSelection() // Поиск "активного" выделения
{ // по всей иерархии меню
Menu* tmp;
int found=0;
tmp=selected;
while (!found)
{
if (tmp->IsOpened()) tmp=tmp->GetSub(); // открыто - заходим
else if (tmp->IsSelected()) found=1; // выделено - нашли!
else tmp=tmp->GetNext(); // не выделено - дальше
}
return tmp;
}
int keypress(int ch) // Обработчик нажатий клавиш
{
Menu* tmp;
Menu* sel;
switch (ch)
{
case 0: // Спецклавиша, за ней идет другой код
{
ch=getch();
return keypress(ch);
}
case 75: // Нажата клавиша "Влево"
{ // реакция - если находимся в подменю
int open=0; // выходим из него, иначе - перемещаем
sel=FindSelection(); // выделение Главного меню
tmp=sel->GetParent();
if ((tmp->GetParent() != 0) && tmp)
{
tmp->CloseSubmenu();
fillscreen();
}
else
{
if (selected->IsOpened()) // Если мы не в главном меню
{ // то надо заново открыть подменю
selected->CloseSubmenu();
fillscreen();
open=1;
}
selected->UnSelect();
tmp=list;
while (tmp->GetNext() != selected && tmp->GetNext()!=0) tmp=tmp->GetNext();
selected=tmp;
selected->Select();
if (open) selected->OpenSubmenu();
}
paint(); // Перерисовываем меню
return 0;
}
case 72: // Нажата клавиша "Вверх"
{ // реакция - перемещение курсора вверх,
if (selected->IsOpened()) // если в Главном меню - открываем
{ // подменю
sel=FindSelection();
tmp = sel->GetParent();
tmp = tmp->GetSub();
if (tmp==sel)
while (tmp->GetNext()!=0) tmp=tmp->GetNext();
else
while (tmp->GetNext()!=sel) tmp=tmp->GetNext();
sel->UnSelect();
tmp->Select();
}
else keypress(13);
paint();
return 0;
}
case 77: // Нажата клавиша "Вправо"
{ // Реакция - если у данного пункта есть
int open=0; // подменю - открываем, если нет - переходим
sel=FindSelection(); // к след. пункту Главного меню.
// В Главном меню - просто переход.
if (sel->GetSub() && (sel != selected)) sel->OpenSubmenu();
else
{
if (selected->IsOpened())
{
selected->CloseSubmenu();
fillscreen();
open=1;
}
selected->UnSelect();
selected=selected->GetNext();
if (selected==0) selected=list;
selected->Select();
if (open) selected->OpenSubmenu();
}
paint(); // Перерисовываем меню
return 0;
}
case 80: // Нажата клавиша "Вниз"
{ // Просто перемещение, в Главном меню
if (selected->IsOpened()) // окрывает подменю
{
sel=selected->GetSub();
tmp=selected->GetSub();
while (tmp)
{
while (tmp && !tmp->IsOpened())
tmp=tmp->GetNext();
if (tmp) tmp=sel=tmp->GetSub();
}
tmp = sel;
while (!tmp->IsSelected())
tmp=tmp->GetNext();
tmp->UnSelect();
tmp=tmp->GetNext();
if (!tmp) tmp = sel;
tmp->Select();
}
else keypress(13);
paint();
return 0;
}
case 27: // Нажата клавиша "Escape"
{ // Реакция - выход и программы
return 1;
}
case 13: // Нажата клавиша "Enter"
{ // Реакция - открытие подменю, если есть,
Menu* tmp; // если нет - диалоговое окно с названием,
tmp=FindSelection(); // и закрываем все вплоть до Главного
if (tmp->GetSub())
{
tmp->OpenSubmenu();
paint();
}
else
{
selected->CloseSubmenu();
fillscreen();
paint();
ShowDialog(tmp->GetName());
paint();
}
return 0;
}
}
return 0;
}
void Run() // Основной цикл программы
{
int ch,rez=0;
fillscreen();
paint(); // Рисуем меню
while (rez!=1) // Пока не ключ выхода
{
ch=getch(); // Ждем нажатия кнопки
rez=keypress(ch); // Обрабатываем нажатие кнопки
}
}
};
void main()
{
MainMenu MyMenu; // Создание Главного Меню
MyMenu.AddItem("Файл"); // Формирование структуры меню
MyMenu.AddSubmenu("Новый");
MyMenu.AddItem("Открыть");
MyMenu.AddSubmenu("Программу");
MyMenu.AddItem("Проект");
MyMenu.LevelUp();
MyMenu.AddItem("Печать");
MyMenu.AddSubmenu("Программы");
MyMenu.AddItem("Проекта");
MyMenu.AddItem("Параметры страницы");
MyMenu.AddItem("Предварительный просмотр");
MyMenu.AddItem("Установки принтера");
MyMenu.LevelUp();
MyMenu.LevelUp();
MyMenu.AddItem("Правка");
MyMenu.AddSubmenu("Поиск");
MyMenu.AddSubmenu("Поиск вперед");
MyMenu.AddItem("Поиск назад");
MyMenu.AddItem("Поиск и замена");
MyMenu.LevelUp();
MyMenu.AddItem("Переход");
MyMenu.AddItem("Стили");
MyMenu.AddSubmenu("Основной текст");
MyMenu.AddItem("Комментарий");
MyMenu.AddItem("Заголовок");
MyMenu.AddItem("Ссылка");
MyMenu.LevelUp();
MyMenu.AddItem("Очистить");
MyMenu.AddItem("Вставить объект");
MyMenu.AddSubmenu("Из файла");
MyMenu.AddItem("Таблица");
MyMenu.AddItem("Диаграмма");
MyMenu.AddItem("Со сканнера");
MyMenu.AddItem("Сноска");
MyMenu.LevelUp();
MyMenu.AddItem("Выделить все");
MyMenu.LevelUp();
MyMenu.AddItem("Вид");
MyMenu.AddSubmenu("Документ");
MyMenu.AddSubmenu("Обычный");
MyMenu.AddItem("Разметка");
MyMenu.AddItem("Синтаксическая подсветка");
MyMenu.AddItem("Показывать ссылки");
MyMenu.LevelUp();
MyMenu.AddItem("Среда");
MyMenu.AddSubmenu("Панели инструментов");
MyMenu.AddItem("Окно отладчика");
MyMenu.AddItem("Окно процессора");
MyMenu.LevelUp();
MyMenu.LevelUp();
MyMenu.AddItem("Сервис");