Функция 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;
Читать дальше