Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 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 - выяснить самостоятельно!

}

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных