Читаем Основы программирования в Linux полностью

Функция attrset устанавливает атрибуты curses, функции attron и attroff включают и отключают заданные атрибуты, не портя остальные, а функции standout и standend обеспечивают более выразительный режим выделения или "лучший из всех" режим. На большинстве терминалов выбирается инверсия.

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

Упражнение 6.2. Перемещение, вставка и атрибуты

Теперь, когда вы знаете больше об управлении экраном, можно испытать более сложный пример moveadd.c. Вы включите несколько вызовов функций refresh и sleep в этот пример, чтобы на каждом шаге видеть, как выглядит экран. Обычно программы с использованием библиотеки curses стараются обновлять экран как можно реже, поскольку это не слишком высокопроизводительная операция. Программный код написан с некоторой долей искусственности для обеспечения большей наглядности.

1. Для начала вставьте несколько заголовочных файлов, определите несколько символьных массивов и указатель на них, а затем инициализируйте структуры библиотеки curses:

#include 

#include 

#include 

#include 

#include 

int main {

 const char witch_one[] = " First Witch ";

 const char witch_two[] = " Second Witch ";

 const char *scan_ptr;

 initscr;

2. Теперь для трех начальных текстовых фрагментов, которые появляются на экране через определенные интервалы, включите и отключите соответствующие флаги атрибутов;

 move(5, 15);

 attron(A_BOLD);

 printw("%s", "Macbeth");

 attroff(A_BOLD);

 refresh;

 sleep(1);

 move(8, 15);

 attron(A_STANDOUT);

 printw("%s", "Thunder and Lightning");

 attroff(A_STANDOUT);

 refresh;

 sleep(1);

 move(10, 10);

 printw("%s", "When shall we three meet again");

 move(11, 23);

 printw("%s", "In thunder, lightning, or in rain ?");

 move(13, 10);

 printw("%s", "When the hurlyburly's done, ");

 move(14, 23);

 printw("%s", "When the battle's lost and won.");

 refresh;

 sleep(1);

3. Действующие лица идентифицированы, и их имена выводятся посимвольно:

 attron(A_DIM);

 scan_ptr = witch_one + strlen(witch_one) - 1;

 while (scan_ptr != witch_one) {

  move(10, 10);

  insch(*scan_ptr--);

 }

 scan_ptr = witch_two + strlen(witch_two) - 1;

 while (scan_ptr != witch_two) {

  move(13, 10);

  insch(*scan_ptr--);

 }

 attroff(A_DIM);

 refresh;

 sleep(1);

4. В заключение переместите курсор в правый нижний угол экрана, а затем подготовьте и выполните завершение:

 move(LINES - 1, COLS - 1);

 refresh;

 sleep(1);

 endwin;

 exit(EXIT_SUCCESS);

}

Когда вы выполните программу, заключительный экран будет выглядеть так, как показано на рис. 6.3. К сожалению, снимок экрана не дает полного впечатления и не показывает курсор, установленный в правом нижнем углу экрана. Эмулятор xterm может быть более подходящей средой для точного отображения программ, чем обычная консоль.

Рис. 6.3

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

После инициализации некоторых переменных и экрана с помощью библиотеки curses вы применили функции move для перемещения курсора по экрану. Посредством функций attron и attroff вы управляли атрибутами текста, выводимого в заданную точку экрана. Далее перед закрытием библиотеки curses и завершением программа продемонстрировала, как вставлять символы функцией insch.

<p>Клавиатура</p>

Наряду с предоставлением интерфейса, облегчающего управление экраном, библиотека curses также предлагает средства, облегчающие управление клавиатурой.

<p>Режимы клавиатуры</p>

Процедуры считывания с клавиатуры управляются режимами. Режимы устанавливаются с помощью следующих функций:

#include

int echo(void);

int noecho(void);

int cbreak(void);

int nocbreak(void);

int raw(void);

int noraw(void);

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже