Функция clrtobot
очищает экран, начиная с текущей позиции курсора и далее до конца экрана, а функция clrtoeol
очищает экран, начиная с текущей позиции курсора до конца строки, в которой находится курсор.
Для перемещения курсора применяется единственная функция с дополнительной командой, управляющей положением курсора после обновления экрана.
#include
int move(int new_y, int new_x);
int leaveok(WINDOW *window_ptr, bool leave_flag);
Функция move
просто переносит позицию логического курсора в заданное место на экране. Напоминаем о том, что начало экранных координат (0, 0) находится в левом верхнем углу экрана. В большинстве версий библиотеки curses две глобальные целочисленные переменные, LINES
и COLUMNS
, определяют размер физического экрана и могут применяться для определения максимально допустимых значений параметров new_y
и new_x
. Вызов move
сам по себе не приводит к перемещению физического курсора. Он только изменяет позицию на логическом экране, в которой появится следующий вывод. Если вы хотите, чтобы экранный курсор переместился немедленно после вызова функции move, вставьте следом за ним вызов функции refresh
.
Функция leaveok
устанавливает флаг, управляющий положением курсора на физическом экране после его обновления. По умолчанию флаг равен false
, и после вызова refresh
аппаратный курсор остается в той же точке экрана, что и логический курсор. Если флаг равен true
, аппаратный курсор можно оставить в случайно выбранной точке экрана. Как правило, значение, устанавливаемое по умолчанию, предпочтительней, т.к. курсор остается в не лишенной смысла позиции.
У всех символов, обрабатываемых curses, могут быть определенные атрибуты, управляющие способом отображения символа на экране при условии, что оборудование, применяемое для их отображения, поддерживает требуемый атрибут. Определены следующие атрибуты: A_BLINK
, A_BOLD
, A_DIM
, A_REVERSE
, A_STANDOUT
и A_UNDERLINE
. Вы можете использовать перечисленные далее функции для установки атрибутов по одному или все вместе.
#include
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
#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;
Читать дальше