Основы программирования в Linux
У библиотеки curses есть свой символьный тип данных
, который может содержать больше разрядов, чем стандартный типchtype. В стандартной версии ncurses для ОС Linuxcharна самом деле — синоним стандартного типаchtype.unsigned longФункции
иaddchвставляют заданные символ или строку в текущую позицию на экране. Функцияaddchstrформатирует строку так же, как функцияprintw, и помещает в текущую позицию на экране. Функцияprintfвызывает обновление физического экрана, возвращаяrefreshв случае успеха иOKпри возникновении ошибки. ФункцияERRпозволяет нарисовать рамку вокруг окна.boxПримечаниеВ стандартной библиотеке curses вы можете применять только "обычные" символы для рисования горизонтальных и вертикальных линий. В расширенной версии библиотеки можно использовать два определения,
иASC_VLINE, для вывода символов вертикальных и горизонтальных линий соответственно, которые позволят нарисовать внешне более привлекательную рамку. Для этого ваш терминал должен поддерживать символы псевдографики. Обычно они лучше отображаются в окне эмулятора xterm, чем на стандартной консоли, но их поддержка полна корректировок или "заплат", поэтому мы полагаем, что вы откажетесь от их применения, если важна переносимость вашей программы.ACS_HLINEФункция
вставляет символ, сдвигая имеющиеся символы вправо. При этом не определено, что произойдет в конце строки, результат зависит от используемого терминала. Функцияinschвставляет пустую строку, перемещая имеющиеся строки на одну вниз. Функцииinsertlnиdelchаналогичны функциямdeleteln.insertДля получения звука можно вызвать функцию
. Немногие терминалы не способны издавать звуки, в этом случае некоторые установки библиотеки curses при вызовеbeepзаставят экран мигать. Если вы работаете в густонаселенном офисе и звуковые сигналы могут издавать многие компьютеры, возможно, вы сочтете мигание предпочтительным режимом. Как и ожидалось, функцияbeepвызывает мигание экрана, если это невозможно, она попробует заставить терминал издать звуковой сигнал взамен.flashСчитывание с экрана
Вы можете считывать символы с экрана, хотя эта функциональная возможность применяется нечасто, поскольку гораздо легче отслеживать то, что выводится. Если вам все-таки это потребуется, выполняйте считывание с помощью следующих функций:
<b>#include <curses.h></b><b>chtype inch(void);</b><b>int instr(char *string);</b><b>int innstr(char *string, int number_of_characters);</b>Функция
должна быть всегда доступна, а функцииinchиinstrне всегда поддерживаются. Функцияinnstrвозвращает символ из текущей позиции курсора на экране и данные о его атрибутах. Обратите внимание на то, что функция возвращает значение неinch, achar, в то время как функцииchtypeиinstrпишут в массивы с элементами типаinnstr.charОчистка экрана
Существует четыре основных способа очистки области экрана:
<b>#include <curses.h></b><b>int erase (void);</b><b>int clear(void);</b><b>int clrtobot(void);</b><b>int clrtoeol(void);</b>Функция
записывает пробелы во все позиции экрана. Функцияerase, как иclear, очищает экран, но вызывает перерисовку экрана с помощью внутреннего вызова низкоуровневой функции clearerasek, которая выполняет последовательность очистки экрана и новое отображение экрана при следующем вызовеo.refreshФункция
обычно применяет команду терминала, которая очищает весь экран, а не пытается стереть текущие непробельные символы во всех точках экрана. Это делает функциюclearнадежным средством очистки экрана. Сочетание функцииclearс последующей функциейclearможет обеспечить удобную команду перерисовки экрана в том случае, когда изображение на экране беспорядочно или испорчено каким-либо образом.refreshФункция
очищает экран, начиная с текущей позиции курсора и далее до конца экрана, а функцияclrtobotочищает экран, начиная с текущей позиции курсора до конца строки, в которой находится курсор.clrtoeolПеремещение курсора
Для перемещения курсора применяется единственная функция с дополнительной командой, управляющей положением курсора после обновления экрана.
<b>#include <curses.h></b><b>int move(int new_y, int new_x);</b><b>int leaveok(WINDOW *window_ptr, bool leave_flag);</b>Функция
просто переносит позицию логического курсора в заданное место на экране. Напоминаем о том, что начало экранных координат (0, 0) находится в левом верхнем углу экрана. В большинстве версий библиотеки curses две глобальные целочисленные переменные,moveиLINES, определяют размер физического экрана и могут применяться для определения максимально допустимых значений параметровCOLUMNSиnew_y. Вызовnew_xсам по себе не приводит к перемещению физического курсора. Он только изменяет позицию на логическом экране, в которой появится следующий вывод. Если вы хотите, чтобы экранный курсор переместился немедленно после вызова функции move, вставьте следом за ним вызов функцииmove.refreshФункция
устанавливает флаг, управляющий положением курсора на физическом экране после его обновления. По умолчанию флаг равенleaveok, и после вызоваfalseаппаратный курсор остается в той же точке экрана, что и логический курсор. Если флаг равенrefresh, аппаратный курсор можно оставить в случайно выбранной точке экрана. Как правило, значение, устанавливаемое по умолчанию, предпочтительней, т.к. курсор остается в не лишенной смысла позиции.true