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

ЖАНРЫ

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

1. Вставьте заголовочный файл curses.h и в функцию

main
, включите вызовы для инициализации и возврата в исходное состояние библиотеки curses:

#include <unistd.h>

#include <stdlib.h>

#include <curses.h>

int main {

 initscr;

 ...

 endwin;

 exit(EXIT_SUCCESS);

}

2. Внутрь поместите код для перемещения курсора в точку (5, 15) на логическом экране, выведите приветствие "Hello World" и обновите реальный экран. В заключение

примените вызов
sleep(2
) для того, чтобы приостановить выполнение программы на две секунды и просмотреть вывод на экран перед ее завершением:

move(5, 15);

printw("%s", "Hello World");

refresh;

sleep(2);

Пока программа выполняется, вы видите фразу "Hello World" в левом верхнем квадранте пустого экрана (рис. 6.2).

Рис. 6.2

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

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

Экран

Как: вы уже видели, все программы с использованием curses должны начинаться с вызова функции

initscr
и заканчиваться вызовом функции
endwin
. Далее приведены их описания из заголовочного файла.

#include <curses.h>

WINDOW *initscr(void);

int endwin(void);

Функция

initscr
должна вызываться только один раз в каждой программе. В случае успешного завершения она возвращает указатель на структуру
stdscr
. Если функция заканчивается аварийно, она просто выводит диагностическое сообщение об ошибке и вызывает завершение программы.

Функция

endwin
возвращает константу OK в случае успешного завершения и err в случае неудачи. Вы можете вызвать ее для того, чтобы покинуть curses, а позже возобновить функционирование библиотеки curses, вызвав
clearok(stdscr, 1)
и
refresh
. Это позволит библиотеке совершенно забыть, как выглядит физический экран, и заставит ее выполнить полное обновление экрана.

Вывод на экран

Для обновления экрана предоставляется несколько базовых функций.

#include <curses.h>

int addch(const chtype char_to_add);

int addchstr(chtype *const string_to_add);

int printw(char *format, ...);

int refresh(void);

int box(WINDOW *win_ptr, chtype vertical_char, chtype horizontal_char);

int insch(chtype char_to_insert);

int insertln(void);

int delch(void);

int deleteln(void);

int beep(void);

int flash(void);

У библиотеки curses есть свой символьный тип данных

chtype
, который может содержать больше разрядов, чем стандартный тип
char
. В стандартной версии ncurses для ОС Linux
chtype
на самом деле — синоним стандартного типа
unsigned long
.

Функции

addch
и
addchstr
вставляют заданные символ или строку в текущую позицию на экране. Функция
printw
форматирует строку так
же, как функция
printf
, и помещает в текущую позицию на экране. Функция
refresh
вызывает обновление физического экрана, возвращая
OK
в случае успеха и
ERR
при возникновении ошибки. Функция
box
позволяет нарисовать рамку вокруг окна.

Примечание

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

ASC_VLINE
и
ACS_HLINE
, для вывода символов вертикальных и горизонтальных линий соответственно, которые позволят нарисовать внешне более привлекательную рамку. Для этого ваш терминал должен поддерживать символы псевдографики. Обычно они лучше отображаются в окне эмулятора xterm, чем на стандартной консоли, но их поддержка полна корректировок или "заплат", поэтому мы полагаем, что вы откажетесь от их применения, если важна переносимость вашей программы.

Функция

insch
вставляет символ, сдвигая имеющиеся символы вправо. При этом не определено, что произойдет в конце строки, результат зависит от используемого терминала. Функция
insertln
вставляет пустую строку, перемещая имеющиеся строки на одну вниз. Функции
delch
и
deleteln
аналогичны функциям
insert
.

Для получения звука можно вызвать функцию

beep
. Немногие терминалы не способны издавать звуки, в этом случае некоторые установки библиотеки curses при вызове
beep
заставят экран мигать. Если вы работаете в густонаселенном офисе и звуковые сигналы могут издавать многие компьютеры, возможно, вы сочтете мигание предпочтительным режимом. Как и ожидалось, функция
flash
вызывает мигание экрана, если это невозможно, она попробует заставить терминал издать звуковой сигнал взамен.

Считывание с экрана

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

#include <curses.h>

chtype inch(void);

int instr(char *string);

int innstr(char *string, int number_of_characters);

Функция

inch
должна быть всегда доступна, а функции
instr
и
innstr
не всегда поддерживаются. Функция
inch
возвращает символ из текущей позиции курсора на экране и данные о его атрибутах. Обратите внимание на то, что функция возвращает значение не
char
, a
chtype
, в то время как функции
instr
и
innstr
пишут в массивы с элементами типа
char
.

Очистка экрана

Существует четыре основных способа очистки области экрана:

#include <curses.h>

int erase (void);

int clear(void);

int clrtobot(void);

int clrtoeol(void);

Функция

erase
записывает пробелы во все позиции экрана. Функция
clear
, как и
erase
, очищает экран, но вызывает перерисовку экрана с помощью внутреннего вызова низкоуровневой функции clear
o
k, которая выполняет последовательность очистки экрана и новое отображение экрана при следующем вызове
refresh
.

Поделиться с друзьями: