Проектирование и реализация интерфейса пользователя (меню на Си)
Рефераты >> Программирование и компьютеры >> Проектирование и реализация интерфейса пользователя (меню на Си)

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("Сервис");


Страница: