[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Управление данными в окне с помощью функций Curses

При инициализации curses на экране автоматически появляется stdscr. Вы можете управлять этим окном с помощью библиотеки функций curses или создать собственные пользовательские окна. В этом разделе описаны следующие возможности управления данными в окне:

Создание окон

С помощью функции newwin вы можете создать собственное окно.

newwin Создает новую структуру данных, описывающую окно.

При каждом вызове функции newwin библиотека curses выделяет память для размещения новой структуры, описывающей окно. Эта структура содержит всю информацию, связанную с новым окном. В библиотеке Curses число создаваемых окон не ограничено. Число вложенных окон ограничено объемом доступной памяти и задается значением SHRT_MAX в файле /usr/include/limits.h.

Вы можете изменять параметры окон вне зависимости от порядка их создания. Обновление дисплея терминала выполняется с помощью функции wrefresh.

Вложенные окна


subwin Создает окно, вложенное в существующее окно.

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

Панели


newpad Создает новую структуру данных, описывающую панель.
subpad Создает и возвращает указатель на вложенную панель.

Координаты новой вложенной панели задаются относительно родительской панели.

Удаление окон, панелей и вложенных окон

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

Изменение содержимого окна или экрана

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

Обновление содержимого окна

После записи вывода в структуру с описанием окна или панели необходимо обновить дисплей для отображения внесенных изменений. При обновлении выполняются следующие операции:


refresh или wrefresh Обновляет дисплей и curscr для отображения внесенных изменений.
wnoutrefresh и doupdate Обновляет указанные окна и выводит их на дисплей. Эти функции применяются, когда требуется отобразить изменения в нескольких окнах.

Функции refresh и wrefresh сначала вызывают функцию wnoutrefresh для копирования обновляемого окна на текущий экран. После этого вызывается функция doupdate для обновления дисплея.

Кроме того, вы можете обновить одновременно несколько окон, воспользовавшись одним из следующих способов. Можно выполнить серию вызовов функции wrefresh, в результате чего будут попеременно вызываться функции wnoutrefresh и doupdate. Можно также вызвать функцию wnoutrefresh для каждого окна, а потом один раз вызвать doupdate. Во втором способе вывод на экран передается только один раз.

Функции перерисовки панелей

Функции prefresh и pnoutrefresh работают аналогично функциям wrefresh и wnoutrefresh.

prefresh и pnoutrefresh Обновляет дисплей терминал и curscr для отображения изменений, внесенных в содержимое панели.

Функция prefresh обновляет текущее окно и физический дисплей, а функция pnoutrefresh обновляет curscr для отображения изменений в пользовательской панели. Так как в данном обрабатываются не окна, а панели, необходимо указать дополнительные параметры, задающие измененные части панели и окна.

Обновление неизменных областей

Во время обновления на дисплее перерисовываются только измененные области. Участки, остающиеся неизменными, можно обновить с помощью функций touchwin и touchline.

 

touchline Выполняет принудительное обновление группы строк при следующем вызове функции wrefresh .
touchwin Выполняет принудительное обновление всех символов в окне при следующем вызове функции wrefresh. Функция touchwin не сохраняет информацию об оптимизации. Эта функция полезна при работе с перекрывающимися окнами.

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

Искажение окон

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

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

Если данные в окне показаны неправильно, вызовите функцию wrefresh для curscr, что позволить восстановить соответствие между физическим дисплеем и внутренним представлением данных.

Управление содержимым окна

Программы могут управлять созданными окнами.

box Рисует рамку внутри или вокруг окна.
copywin Обеспечивает более точное управление функциями overlay и overwrite.
garbagedlines Указывает curses, что в строке экрана записаны посторонние данные, которые необходимо уничтожить перед записью информации в эту строку.
mvwin Перемещает обычное или вложенное окно.
overlay и overwrite Копирует одно окно поверх другого.
ripoffline Удаляет строку из экрана по умолчанию.

Функция mvwin перемещает обычное или вложенное окно. Функция box рисует рамку вокруг обычного или вложенного окна.

Функции overlay и overwrite применяются в случае перекрытия окон. При этом функция overwrite уничтожает данные в отличие от функции overlay. Это значит, что при копировании текста из одного окна в другое с помощью функции overwrite пустые фрагменты целевого окна заменяются соответствующими фрагментами копируемого окна. Функция overlay не копирует пустые фрагменты.

Так же, как функции overlay и overwrite, функция copywin позволяет скопировать часть окна в другое окно. Отличие заключается в том, что для вызова функции copywin не требуется, чтобы окна перекрывались.

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

Перед записью в окно новой информации вы можете вызвать функцию garbagedlines, которая уничтожает строки в указанном диапазоне.

Поддержка фильтров

Для работы с приложениями-фильтрами curses используется функция filter.

filter Задает размер окна терминала равным 1 строке.

Эта функция преобразует окно stdscr, после чего функции curses могут работать с ним, как с одной строкой. После вызова filter функции curses не применяют средства работы с терминалом, в которых требуется указывать, обработка какой строки выполняется в данный момент.

Связанная информация

Глава 2, Библиотека curses

Окна в среде Curses


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]