ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Основная организующая функцияФункция popup() является основной функцией организующей работу с меню. Функция возвращает код выбора, соответствующий выбранному пункту меню или: -1, если была нажата клавиша ESC, -2, если меню не может быть создано и -3, если адаптер работает не в подходящих текстовых режимах. Параметры функции следующие: menu – ссылка на строки текста меню, keys – набор кодов горячих клавиш, count – количество пунктов меню, x и y – координаты верхнего левого угла экрана для отображаемого меню, border – если не 0, то меню выводится в окружении рамки.
extern char far * vid_mem; // указатель начального адреса видеобуфера int popup(char *menu[], char *keys, int count, int x, int y, int border) { register int i, len; int endx, endy, choice, vmode; extern int vid_mem; unsigned int *p; if((x > 24)||x < 0)||(y > 79)||(y < 0)) return -2; // выход за физический экран // контроль размещения меню len = 0; for(i = 0; i < count; i++) // count содержит число пунктов меню if(strlen(menu[i]) > len) len = strlen(menu[i]); // определение максимальной длины // строки меню endy = len + 2 + y; //y – начальная координата меню по вертикали endx = count + 1 + x; // x - начальная координата меню по горизонтали if((endx + 1 > 24)||(endy + 1 >79)) return -2; // выход за физический экран vmode = video_mode(); // определение видеорежима if((vmode!= 2)&&(vmode!= 3)&&(vmode!= 7)) return -3; // не текстовый режим // определение адреса видеопамяти vid_mem = (char far*)(vmode == 7? 0xb0000000: 0xb8000000); // выделение heap-памяти для запоминание текста под меню if((p = (unsigned int *)malloc((endx – x +1)*(endy –y +1))) ==NULL) return -2; // нет heap-памяти // сохранение части экрана, перекрываемого меню save_video(x, endx + 1, y, y + 1, p); if (border) draw_border(x, y, endx, endy); // вывод рамки, если border!= 0 display_menu(menu, x, y, count); // вывод меню на экран choice = get_resp(x, y, count, menu, keys); // ожидание выбора пользователя restore_video(x, endx+1, y, endy+1, p); // восстановление перекрытой меню части экрана free(p); return choice; // возврат кода выбранного пункта меню } Функция video_mode() возвращает информацию о текущем режиме работы адаптера. int video_mode() { union REGS r; r.h.ah = 0x0F; return int86(0x10, &r, &r) & 255; //возвращает значение с AX - выяснить самостоятельно! }
Не нашли, что искали? Воспользуйтесь поиском:
|