Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Упражнение 6.5. Вложенные окна




Теперь, когда вы познакомились с новыми функциями, этот короткий пример покажет, как они действуют и чем отличаются от функций окна, применявшихся ранее.

1. Начальная секция кода программы subscl.c инициализирует отображение базового окна с некоторым текстом:

#include <unistd.h>

#include <stdlib.h>

#include <curses.h>

 

int main() {

WINDOW *sub_window_ptr;

int x_loop;

int y_loop;

int counter;

char a_letter = '1';

initscr();

for (y_loop = 0; y_loop < LINES - 1; y_loop++) {

for (x_loop = 0; x_loop < COLS - 1; x_loop++) {

mvwaddch(stdscr, y_loop, x_loop, a_letter);

a_letter++;

if (a_letter > '9') a_letter = '1';

}

}

2. Теперь создайте новое подокно с прокруткой. Как рекомендовалось, вам следует перед обновлением экрана "коснуться" родительского окна:

ub_window_ptr = subwin(stdscr, 10, 20, 10, 10);

scrollok(sub_window_ptr, 1);

touchwin(stdscr);

refresh();

sleep(1);

3. Сотрите содержимое вложенного окна, выведите в нем текст и обновите его. Прокрутка текста обеспечивается циклом:

werase(sub_window_ptr);

mvwprintw(sub_window_ptr, 2, 0, "%s", "This window will now scroll");

wrefresh(sub_window_ptr);

sleep(1);

for (counter = 1; counter < 10; counter++) {

wprintw(sub_window_ptr, "%s", "This text is both wrapping and \

scrolling.");

wrefresh(sub_window_ptr);

sleep(1);

}

4. Завершив цикл, удалите вложенное окно и обновите основной экран:

delwin(sub_window_ptr);

touchwin(stdscr);

refresh();

sleep(1);

endwin();

exit(EXIT_SUCCESS);

}

К концу программы вы увидите вывод, показанный на рис. 6.6.

Рис. 6.6

 

Как это работает

После присвоения указателю

sub_window_ptr

результата вызова

subwin

вы включаете прокрутку вложенного окна. Даже после удаления вложенного окна и обновления базового окна (

strdcr

) текст на экране не меняется, поскольку вложенное окно на самом деле откорректировало символьные данные экрана

strdcr

.

Дополнительная клавиатура

Вы уже познакомились с некоторыми средствами библиотеки curses для обработки клавиатурного ввода. У многих клавиатур, как минимум, есть клавиши управления курсором и функциональные клавиши. Кроме того, у многих клавиатур есть дополнительная клавиатура и другие клавиши, например, <Insert> и <Home>.

Для большинства терминалов расшифровка этих клавиш — серьезная проблема, потому что они посылают строку символов, начинающуюся с escape-символа. Дело не только в том, что приложению трудно отличить одиночное нажатие клавиши <Esc> от строки символов, появившейся в результате нажатия функциональной клавиши, оно еще должно справляться с терминалами разных типов, применяющими разные управляющие последовательности для одних и тех же логических клавиш.

К счастью, библиотека curses предоставляет элегантное решение для управления функциональными клавишами. Обычно в структуре

terminfo

для каждого терминала хранится последовательность, отправляемая каждой функциональной клавишей, и во включенном в программу файле curses.h для логических клавиш есть набор определений, начинающихся с префикса

KEY_

.

Когда curses стартует, преобразование последовательностей в логические клавиши отключено, и его следует включить вызовом функции

keypad

. Если вызов успешен, функция вернет

OK

, в противном случае

ERR

.

#include <curses.h>

int keypad(WINDOW *window_ptr, bool keypad_on);

Когда режим дополнительной клавиатуры включен с помощью вызова функции

keypad

с параметром

keypad_on

, равным

true

, библиотека curses принимает на себя обработку клавиатурных последовательностей, так что чтение с клавиатуры может вернуть не только нажатую клавишу, но и одно из определений вида

KEY_

для логических клавиш.

Отметьте три незначительных ограничения, налагаемых при использовании режима дополнительной клавиатуры.

□ Распознавание escape-последовательностей требует разного времени, и многие сетевые протоколы сгруппируют символы в пакеты (что приведет к неверному распознаванию escape-последовательностей) или разделят их (что приведет к распознаванию последовательностей функциональных клавиш, как клавиши <Esc> и отдельных символов). Такое поведение чаще всего наблюдается в региональных сетях (Wide-Area Network, WAN) и других медленных линиях связи. Единственный выход — попытаться запрограммировать терминалы так, чтобы они отправляли единичные уникальные символы в ответ на нажатие каждой функциональной клавиши, используемой вами, хотя это ограничит количество управляющих символов.

□ Для того чтобы библиотека curses могла отличить нажатие клавиши <Esc> от клавиатурной последовательности, начинающейся с символа

Esc

, ей требуется ожидание в течение короткого промежутка времени. Иногда при включенном режиме дополнительной клавиатуры можно заметить легкую задержку при обработке клавиши <Esc>.

□ Библиотека curses не может обрабатывать неуникальные escape-последовательности. Если у вашего терминала есть две разные клавиши, отправляющие одну и ту же последовательность, библиотека просто не будет ее обрабатывать, поскольку не может решить, какую логическую клавишу следует вернуть.

Выполните упражнение 6.6.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...