
- •Введение
- •1. Общие принципы создания интерфейса
- •1.1. Эргономические характеристики интерфейса
- •1.2. Составные части интерфейса
- •1.3. Виды диалога
- •1.4. Процессы ввода – вывода
- •1.5. Методы разработки подпрограмм нижнего уровня
- •Int int86(int num, union regs *inregs, union regs *outregs);
- •Void pokeb(unsigned seg, unsigned off, char value);
- •Int getch();
- •2. Исчезающее меню
- •2.1. Алгоритм создания исчезающего меню
- •2.2. Сохранение и восстановление экрана
- •2.3. Вывод меню и рамки
- •2.4. Определение выбора пользователя
- •2.5. Подпрограмма исчезающего меню
- •3. Иерархическое меню
- •3.1. Фреймы меню
- •3.2. Подпрограмма активизации меню
- •3.3. Организация иерархического меню
- •3.4. Всплывающие окна
- •Void window(int num);
- •Void deactivate(int num);
- •4. Графический интерфейс
- •4.1. Организация меню в графическом режиме
- •Void outtextxy ( int X, int y, char *s);
- •4.2. Организация графического диалога
- •4.3. Особенности графического режима
- •Void putpixel (int color, int X, int y)
- •4.4. Форматы хранения графических файлов
- •5. Прикладной интерфейс для windows
- •5.1. Приложения Windows
- •5.2. Каркас приложения
- •5.3. Обработка сообщений в системе Windows
- •Int ReleaseDc(hwnd hwnd, hdc hdc);
- •Int MessageBox(hwnd hwnd, lpcstr lpText, lpcstr lpCaption, uint wMbType);
- •Int response;
- •5.4. Меню в системе Windows
- •5.5. Диалоги в системе Windows
- •Int DialogBox(hinstance hThisInst,
- •5.6. Пример программы, использующей список и окно ввода
- •6. Лабораторная 1
- •Варианты заданий
- •Пример выполнения задания
- •7 Лабораторная 2
- •Варианты заданий
- •Пример выполнения задания
3. Иерархическое меню
Меню, в котором по крайней мере одна из опций содержит подменю, называется иерархическим. Оно отличается от исчезающего меню тем, что исчезающее меню имеет один уровень вложенности в глубину, а иерархическое – больше одного уровня.
3.1. Фреймы меню
Фреймом меню называется структура, содержащая указатель на область сохранения и массив строк меню, координаты углов прямоугольника, являющегося областью вывода, количество опций меню и дополнительную информацию. Каждому подменю иерархического меню соответствует один фрейм. Для создания иерархического меню определяется массив фреймов:
struct menu_frame
{
int startx, starty, endx, endy ; // координаты углов
unsigned char *p ; //указатель на область сохранения
char *menu [] ; //массив строк подменю
int border ; //рамка включена / выключена
int count ; //число опций
int active ; // 1- активно меню, 0 – нет
int horizont ; // 1- горизонтальная линейка
// 0 – вертикальное меню
} frame [MAX_FRAME];
если frame[i]. horizont = 0, то меню выводится в виде строк текста, расположенных сверху вниз. Если frame[i]. horizont = 1, то опции меню расположены в одну линию, слева направо.
Всем меню, входящим в иерархическое меню, присваиваются номера. Меню, имеющему номер i, ставится в соответствие i-й элемент массива фреймов. В главной программе поля фреймов заполняются с помощью функции, первым аргументом которой является номер фрейма, а остальные аналогичны аргументам функции popup() исчезающего меню. Последний параметр указывает, будет ли меню горизонтальным. Эта функция определяет также свободную память для сохранения области вывода.
int make_menu (int num, //номер фрейма
char *menu[], //список опций
char *keys, //горячие клавиши
int count, //число опций
int x, int y, //левый верхний угол
int border, //рамка есть/нет
int horizont)
{
register int i, len;
int endx, endy, choice, vmode;
unsigned char *p; //указатель на область сохранения
if (num > MAX_FRAME)
{
printf(“Слишком много меню”);
return 0;
}
if ((x > 79)||(x < 0)||(y > 24)||(y < 0))
{
printf(“Выход за пределы экрана”);
return -2;
}
len=0; //вычисление размеров меню
if (horizont) //если горизонтальное, то ширина равна
{ //сумме длин опций
for (i=0; i < count; i++) len+=strlen(menu[i]); }
else //иначе максимуму длин строк
{
for(i=0; i < count; i++)
if (strlen(menu[i]) > len)
len=strlen(menu[i]);
}
endx=len+x+1;
if((endx > 79)||(endy > 24))
{
printf(“Выход за пределы экрана”);
return –2;
}
p=(unsigned char*) malloc((len+2)*(count+2)*2);
//захват свободной памяти
if(!p)
{
printf(“Не хватило памяти”);
exit(1);
}
/*далее идет заполнение фрейма*/
frame[num].startx = x;
frame[num].endx = endx;
frame[num].starty = y;
frame[num].endy = endy;
frame[num].p = p;
frame[num].menu = (char**)menu;
frame[num].border = border;
frame[num].keys = keys;
frame[num].count = count;
frame[num].active = 0
frame[num].horizont = horizont;
return 1;
}