Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Упражнение 6.2. Перемещение, вставка и атрибуты




Теперь, когда вы знаете больше об управлении экраном, можно испытать более сложный пример moveadd.c. Вы включите несколько вызовов функций

refresh

и

sleep

в этот пример, чтобы на каждом шаге видеть, как выглядит экран. Обычно программы с использованием библиотеки curses стараются обновлять экран как можно реже, поскольку это не слишком высокопроизводительная операция. Программный код написан с некоторой долей искусственности для обеспечения большей наглядности.

1. Для начала вставьте несколько заголовочных файлов, определите несколько символьных массивов и указатель на них, а затем инициализируйте структуры библиотеки curses:

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

#include <curses.h>

 

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;

while (scan_ptr!= witch_one) {

move(10, 10);

insch(*scan_ptr--);

}

scan_ptr = witch_two + strlen(witch_two) - 1;

while (scan_ptr!= witch_two) {

move(13, 10);

insch(*scan_ptr--);

}

attroff(A_DIM);

refresh();

sleep(1);

4. В заключение переместите курсор в правый нижний угол экрана, а затем подготовьте и выполните завершение:

move(LINES - 1, COLS - 1);

refresh();

sleep(1);

endwin();

exit(EXIT_SUCCESS);

}

Когда вы выполните программу, заключительный экран будет выглядеть так, как показано на рис. 6.3. К сожалению, снимок экрана не дает полного впечатления и не показывает курсор, установленный в правом нижнем углу экрана. Эмулятор xterm может быть более подходящей средой для точного отображения программ, чем обычная консоль.

Рис. 6.3

 

Как это работает

После инициализации некоторых переменных и экрана с помощью библиотеки curses вы применили функции

move

для перемещения курсора по экрану. Посредством функций

attron

и

attroff

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

insch

.

Клавиатура

Наряду с предоставлением интерфейса, облегчающего управление экраном, библиотека curses также предлагает средства, облегчающие управление клавиатурой.

Режимы клавиатуры

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

#include <curses.h>

int echo(void);

int noecho(void);

int cbreak(void);

int nocbreak(void);

int raw(void);

int noraw(void);

Функции

echo

и

noecho

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

cbreak

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

initscr

, устанавливается режим ввода, называемый режимом с обработкой (cooked mode). Это означает построчную обработку, т.е. ввод становится доступен программе после нажатия пользователем клавиши <Enter> (или <Return> на некоторых клавиатурах). Специальные символы на клавиатуре включены, поэтому набор соответствующих клавиатурных последовательностей может сгенерировать сигнал в программе. Управление потоком, если терминал запускается с терминала, также включено. Вызывая функцию

cbreak

, программа может установить режим ввода

cbreak

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

Вызов функции

raw

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

nocbreak

возвращает режим ввода в режим с обработкой символов, но режим обработки специальных символов не изменяет; вызов

noraw

восстанавливает и режим с обработкой, и обработку специальных символов.

Клавиатурный ввод

Чтение с клавиатуры — очень простая операция. К основным функциям чтения относятся следующие:

#include <curses.h>

int getch(void);

int getstr(char *string);

int getnstr(char *string, int number_of_characters);

int scanw(char *format,...);

Все они действуют подобно своим аналогам, не входящим в библиотеку curses,

getchar

,

gets

и

scanf

. Обратите внимание на то, что у функции

getstr

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

getnstr

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

getstr

. Это очень напоминает поведение функций

gets

и

fgets

, с которыми вы познакомились в главе 3.

В упражнении 6.3 для демонстрации управления клавиатурой приведен пример короткой программы ipmode.c.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...