Операционная система UNIX. Руководство программиста

       

Еще об окнах и подпрограмме refresh( )


Как указывалось ранее, подпрограммы curses не обновляют экран, пока не будет вызвана refresh(). Когда refresh() вызывается, все данные, накопленные для вывода, пересылаются на экран текущего терминала.

Эффект использования окна во многом подобен эффекту использования буфера при работе с редактором системы UNIX. Например, когда Вы редактируете файл при помощи vi(1), все изменения содержимого файла отражаются в буфере, а сам файл изменяется только после выдачи команд w или zz. Аналогично, когда Вы вызываете программу, работающую с экраном через пакет curses, изменяется содержимое окна, а сам экран терминала перерисовывается только при вызове refresh().

В <curses.h> содержится описание принятого по умолчанию окна stdscr (стандартное окно), размеры которого совпадают с размерами экрана терминала. В <curses.h> stdscr имеет тип WINDOW*, указатель на структуру языка C, которую пользователь может представлять себе в виде двумерного массива символов, соответствующего экрану терминала. Программа всегда отслеживает как состояние stdscr, так и состояние физического экрана. refresh(), когда вызывается, сравнивает их и посылает на терминал последовательность символов, приводящий его экран в соответствующий содержимому stdscr вид. При этом выбирается один из многих способов сделать это, с учетом характеристик терминала и возможного сходства того, что есть на экране и того, что содержится в окне. Выходной поток оптимизируется таким образом, чтобы он содержал как можно меньше символов. На рисунке ниже показано, что происходит при работе программы, выводящей BullsEye в центре экрана (см. раздел Что такое curses?). Обратите внимание, что, какой бы мусор ни был на экране, он там и останется, пока не будет вызвана refresh(). При этом вызове экран очищается и заполняется текущим содержимым stdscr.

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


Можно разделить экран на большое количество окон, обновляя по желанию то или иное из них. Если окна перекрываются, на экран выводится содержимое того окна, которое обновлялось позже. Можно также создать одно окно внутри другого (первое мы будем иногда называть подокном). Допустим, разрабатываемое Вами приложение использует в качестве интерфейса с пользователем экранные формы, например, для изображения на экране расписки. Тогда можно использовать меньшие, находящиеся внутри основного, окна для управления доступом к отдельным полям такой формы.

Некоторые подпрограммы пакета curses предназначены для работы с окнами особого типа, которые мы будем называть спецокнами. Спецокно - это такое окно, размер которого не ограничивается размером экрана и которое не связано с каким-либо определенным местом на экране. Их можно применять, если Вам нужны очень большие окна, или же такие, которые нужно отображать на экран частями. Спецокна могут, например, понадобиться при работе с электронными таблицами.

Ниже показаны взаимосвязи между несколькими окнами, подокнами и спецокнами и экраном терминала.



В разделе Работа с окнами описываются подпрограммы, необходимые для создания и использования окон. Если Вы хотите сейчас увидеть программу, работающую с окнами средствами curses, см. программу window в разделе Примеры программ, работающих с curses.




Содержание раздела