Книга: Основы программирования в Linux

Атрибуты символов

Атрибуты символов

У всех символов, обрабатываемых curses, могут быть определенные атрибуты, управляющие способом отображения символа на экране при условии, что оборудование, применяемое для их отображения, поддерживает требуемый атрибут. Определены следующие атрибуты: A_BLINK, A_BOLD, A_DIM, A_REVERSE, A_STANDOUT и A_UNDERLINE. Вы можете использовать перечисленные далее функции для установки атрибутов по одному или все вместе.

#include <curses.h>
int attron(chtype attribute);
int attroff(chtype attribute);
int attrset(chtype attribute);
int standout(void);
int standend(void);

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

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

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

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

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

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <curses.h>
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.

Оглавление книги


Генерация: 0.856. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз