Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

 init_pair(7, COLOR_CYAN, COLOR_WHITE);

 for (i = 1; i <= 7; i++) {

attroff(A_BOLD);

attrset(COLOR_PAIR(i));

mvprintw(5 + i, 5, "Color pair %d", i);

attrset(COLOR_PAIR(i) | A_BOLD);

mwprintw(5 + i, 25, "Bold color pair %d", i);

refresh;

sleep(1);

 }

 endwin;

 exit(EXIT_SUCCESS);

}

Выполнение примера приведет к выводу, показанному на рис. 6.7, за вычетом реальных цветов, которые не отображаются на черно-белом снимке экрана.

Рис. 6.7

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

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

Переопределение цветов

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

init_color
:

#include <curses.h>

int init_color(short color_number, short red, short green, short blue);

Она позволяет переопределить существующий цвет (в диапазоне от 0 до

COLORS
) новыми значениями яркости цвета из диапазона от 0 до 1000. Такой подход немного напоминает определение цветовых характеристик в графических файлах формата GIF.

Панели 

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

Это нелегко сделать с помощью функций библиотеки curses, с которыми вы познакомились к этому моменту, т.к. все окна должны быть не больше физического экрана. Библиотека curses предоставляет специальную структуру данных, панель (pad), для манипулирования данными логического экрана, которые не умещаются в стандартном окне.

Структура панели похожа на структуру

WINDOW
, и все функции библиотеки curses, написанные для работы с окнами, можно применять и к панелям. Но у панелей есть и собственные функции для создания и обновления.

Панели создаются во многом так же, как и обычные окна.

#include <curses.h>

WINDOW *newpad(int number_of_lines, int number_of_columns);

Обратите внимание на то, что возвращаемое значение — указатель на структуру типа

WINDOW
, такое же, как у функции
newwin
. Удаляются панели, как и окна, функцией
delwin
.

Но к панелям применяются другие подпрограммы обновления. Поскольку панель не привязана к конкретной точке экрана, вы должны задать область панели, которую хотите поместить на экран, и ее положение на экране. Делайте это с помощью функции prefresh.

#include <сurses.h>

int prefresh(WINDOW *pad_ptr, int pad_row, int pad_column, int screen_row_min, int screen_col_min, int screen_row_max, int screen_соl_max);

Функция выполняет запись области панели, начинающейся в точке (

pad_row
,
pad_column
), в область экрана, определенную от (
screen_row_min
,
screen_col_min
) до (
screen_row_max
,
screen_col_max
).

Есть и дополнительная подпрограмма

pnoutrefresh
. Она действует так же, как функция
wnoutrefresh
, обеспечивая более производительное обновление экрана.

Давайте проверим это на практике с помощью программы pad.с (упражнение 6.8).

Упражнение 6.8. Применение панели

1. В начале этой программы вы инициализируете структуру панели и затем формируете панель с помощью функции, которая возвращает указатель на нее. Вставьте символы, заполняющие структуру панели (панель на 50 символов шире и выше экрана терминала):

#include <unistd.h>

#include <stdlib.h>

#include <curses.h>

int main {

 WINDOW *pad_ptr;

 int x, y;

 int pad_lines;

 int pad_cols;

 char disp_char;

 initscr;

 pad_lines = LINES + 50;

 pad_cols = COLS + 50;

 pad_ptr = newpad(pad_lines, padcols);

 disp_char = 'a';

 for (x = 0; x < pad_lines; x++) {

for (у = 0; у < pad_cols; y++) {

mvwaddch(pad_ptr, x, y, disp_char);

if (disp_char == 'z') disp_char = 'a';

else disp_char++;

}

 }

2. Теперь перед завершением программы нарисуйте разные области панели в разных местах экрана:

Поделиться:
Популярные книги

Древняя Русь и Великая степь

Гумилев Лев Николаевич
Научно-образовательная:
история
7.25
рейтинг книги
Древняя Русь и Великая степь

Лев Толстой

Шкловский Виктор Борисович
363. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Лев Толстой

Кентерберийские рассказы

Чосер Джеффри
Старинная литература:
европейская старинная литература
8.00
рейтинг книги
Кентерберийские рассказы

Эстетика

Бычков Виктор Васильевич
Научно-образовательная:
философия
5.00
рейтинг книги
Эстетика

Старый, но крепкий 2

Крынов Макс
2. Культивация без насилия
Фантастика:
рпг
уся
эпическая фантастика
5.00
рейтинг книги
Старый, но крепкий 2

Отверженный. Дилогия

Опсокополос Алексис
Отверженный
Фантастика:
фэнтези
7.52
рейтинг книги
Отверженный. Дилогия

Магнатъ

Кулаков Алексей Иванович
4. Александр Агренев
Приключения:
исторические приключения
8.83
рейтинг книги
Магнатъ

Три версты с гаком. Я спешу за счастьем

Козлов Вильям Федорович
Проза:
классическая проза
современная проза
5.00
рейтинг книги
Три версты с гаком. Я спешу за счастьем

Война

Валериев Игорь
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Война

Казачество в 1812 году

Шишов Алексей Васильевич
История казачества
Научно-образовательная:
история
5.00
рейтинг книги
Казачество в 1812 году

Болшевцы

Сборник
Документальная литература:
биографии и мемуары
6.00
рейтинг книги
Болшевцы

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон

Тайная доктрина. Том II

Блаватская Елена Петровна
4. Теософия
Религия и эзотерика:
эзотерика
6.60
рейтинг книги
Тайная доктрина. Том II

Дневники 1928-1929

Пришвин Михаил Михайлович
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Дневники 1928-1929