Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯЗЫК СИ_РУКОВОДСТВО ПРОГРАММИСТА.doc
Скачиваний:
12
Добавлен:
18.08.2019
Размер:
438.27 Кб
Скачать

7.2. Запуск

Для того, чтобы использовать пакет экрана, необходимо распределить пространство для curscr и stdscr, что осуществляются функцией initscr(). при попытке распределения пространства для окон памяти может нехватить - в этом случае initscr() возвращает ERR. initscr() необходимо вызывать перед использованием любых функций, работающих с окнами. После распределения окон пользователь может использовать их. Для разрешения скролинга (смещения информации вверх при переходе на следующую строку из последней) в окне необходимо использовать макрос scrollok(). Новые окна могут быть созданы путем использования функций newwin() и subwin(). Функция delwin() уничтожает старые окна.

7.3. Вывод

Допустим, что необходимо обновить терминал. для этого нужно сначала изменить окно, а потом перенести изменения на терминал. Основными функциями, используемыми для изменения окна являются addch() и move(). addch() добавляет символ в позицию с текущими координатам (y,x), а при помощи move() можно изменить текущие координаты. Для выполнения этих функций разом можно использовать mvaddch(). Другие функции вывола, такие как addstr() и printw(), вызывают addch() для добавления символов к окну.

После того, как окно изменено, необходимо вызвать функцию refresh() для обновления терминала. Для оптимизации изменений refresh() считает, что не измененные вами части окна не изменились на терминале. Если это не так, то при помощи функции touchwin() можно заставить refresh() обновить окно на терминале. Заметим, что все обновления refresh() делает по отношению к curscr. Если терминал не соответствует curscr (например на терминал было нечто выведено не функциями пакета или произошел аппаратный сбой), то необходимо полностью обновить терминал, выполнив wrefresh(curscr);

7.4. Ввод

Основная функция ввода - getch(), которая вводит один символ с терминала и, если эхо включено, вызывает addch() и refresh() для отображения символа (системное эхо недопустимо, т.к. пакет экрана должен всегда знать, что происходит на терминале). Существует возможность ввести строку функцией getstr() и осуществить форматный ввод при помощи функции scanf().

7.5. Завершение работы

В начале работы функция initscr() при помощи setterм() осуществляет установку необходимого режима терминала. Для прекращения или приостановки использования процедур пакета необходимо вызвать функцию endwin(), которая выдаст завершающие последовательности и установит режим терминала, который был до вызова initscr(). Необходимо заметить, что окна по endwin() не освобождаются, и работа с окнами может быть возобновлена вызовами setterm() и wrefresh(curscr).

Информация о терминале хранится в наборе переменных,

определенных в файле "curses.h". имена их состоят из 2 букв верхнего

регистра и имеют (в английском языке) мнемоническое значение.

Например, "HO" - строка, которая перемещает курсор к исходному положению (HOME). Переменные описания образуют два набора: набор параметров и набор команд. Параметры имеют логический ("bool" см. ниже) и определяют, имеет данный терминал некоторую аппаратную возможность или особенность, или нет. Переменные набора команд имеют тип "char *" и являются указателями на строки, которые (строки) содержат управляющие последовательности терминала, приводящие к выполнеию определенных функций. Например "UP" - указатель на строку, приводящую к перемещению курсора на экране терминала на одну строку вверх.

Необходимо отметить здесь одну особенность: если у терминала при выводе последнего символа в строке курсор переходит в начало следующей строки (параметр AN == TRUE) и переход из последней строки приводит к аппаратному скроллингу (параметр SD == TRUE), то последнй символ последней строки терминала на терминал не выводится (его вывод привел бы к смещению экрана). при этом этот символ записывается в окно ошибки не возникает. Если данный символ сместится с этого "проклятого" места (например при скроллинге), то он появится на экране терминала.