Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

А теперь выполните упражнение 6.4.

Упражнение 6.4. Управление множественными окнами

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

1. Как обычно, вставьте первыми отсортированные объявления:

#include <unistd.h>

#include <stdlib.h>

#include <curses.h>

int main {

 WINDOW *new_window_ptr;

 WINDOW *popup_windov_ptr;

 int x loop;

 int y_loop;

 char a_letter = 'a';

 initscr;

2. Заполните

базовое окно символами, обновляя физический экран, когда заполнен логический экран:

 move(5, 5);

 printw("%s", "Testing multiple windows");

 refresh;

 for (y_loop = 0; y_loop < LINES - 1; y_loop++) {

for (x_loop = 0; x_loop < COLS - 1; x_loop++) {

mvwaddch(stdscr, y_loop, x_loop, a_letter);

a_letter++;

if (a_letter > 'z') a_letter = 'a';

}

 }

 /* Обновление экрана */

 refresh;

 sleep(2);

3. Теперь создайте окно 10x20 и вставьте в него текст перед прорисовкой окна на экране:

 new_window_ptr = newwin(10, 20, 5, 5);

 mvwprintw(new_window_ptr, 2, 2, "%s", "Hello World");

 mwwprintw(new_window_ptr, 5, 2, "%s",

"Notice how very long lines wrap inside the window");

 wrefresh(new_window_ptr);

 sleep(2);

4. Измените содержимое фонового окна. Когда вы обновите экран, окно, на которое указывает

new_window_ptr
, будет затемнено:

 a_letter = '0';

 for (y_lоор = 0; y_lоор < LINES - 1; y_lоор++) {

for (х_lоор = 0; xloop < COLS - 1; х_lоор++) {

mvwaddch(stdscr, y_loop, х_lоор, a_letter);

a_letter++;

if (a_letter > '9') a_letter = '0';

}

 }

 refresh;

 sleep(2);

5. Если вы выполните вызов для обновления нового окна, ничего не изменится, поскольку вы не изменяли новое окно:

 wrefresh(new_window_ptr);

 sleep(2);

6. Но если вы сначала воспользуетесь функцией

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

 touchwin(new_window_ptr);

 wrefresh(new_window_ptr);

 sleep(2);

7. Добавьте

еще одно накладывающееся окно с рамкой вокруг него.

 popup_window_ptr = newwin(10, 20, 8, 8);

 box(popup_window_ptr, '|', '-');

 mvwprintw(popup_window_ptr, 5, 2, "%s", "Pop Up Window!");

 wrefresh(popup_window_ptr);

 sleep(2);

8. Поиграйте с новыми всплывающими окнами перед их очисткой и удалением.

 touchwin(new_window_ptr);

 wrefresh(new_window_ptr);

 sleep(2);

 wclear(new_window_ptr);

 wrefresh(new_window_ptr);

 sleep(2);

 delwin(new_window_ptr);

 touchwin(popup_window_ptr);

 wrefresh(popup_window_ptr);

 sleep(2);

 delwin(popup_window_ptr);

 touchwin(stdscr);

 refresh;

 sleep(2);

 endwin;

 exit(EXIT_SUCCESS);

}

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

Рис. 6.4

После того как будет изменен фон и появится новое всплывающее окно, вы увидите экран, показанный на рис. 6.5.

Рис. 6.5

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

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

touchwin
заставить curses перерисовать окно, даже если в нем ничего не менялось.

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

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

Примечание

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

Поделиться:
Популярные книги

Отверженный. Дилогия

Опсокополос Алексис
Отверженный
Фантастика:
фэнтези
7.51
рейтинг книги
Отверженный. Дилогия

Кодекс Крови. Книга ХVIII

Борзых М.
18. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХVIII

Император Пограничья 10

Астахов Евгений Евгеньевич
10. Император Пограничья
Фантастика:
городское фэнтези
аниме
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 10

Зодчий. Книга I

Погуляй Юрий Александрович
1. Зодчий Империи
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Зодчий. Книга I

Двойник Короля 2

Скабер Артемий
2. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля 2

Идеальный мир для Лекаря 11

Сапфир Олег
11. Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 11

Меченный смертью. Том 1

Юрич Валерий
1. Меченный смертью
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Меченный смертью. Том 1

Возмездие

Злобин Михаил
4. О чем молчат могилы
Фантастика:
фэнтези
7.47
рейтинг книги
Возмездие

Спасите меня, Кацураги-сан! Том 4

Аржанов Алексей
4. Токийский лекарь
Фантастика:
городское фэнтези
попаданцы
дорама
фэнтези
5.00
рейтинг книги
Спасите меня, Кацураги-сан! Том 4

Одинаковые. Том 3. Индокитай

Алмазный Петр
3. Братья Горские
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Одинаковые. Том 3. Индокитай

Душелов. Том 6

Faded Emory
6. Внутренние демоны
Фантастика:
постапокалипсис
ранобэ
хентай
фэнтези
5.00
рейтинг книги
Душелов. Том 6

Лекарь Империи 6

Карелин Сергей Витальевич
6. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 6

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Жертва

Привалов Сергей
2. Звездный Бродяга
Фантастика:
боевая фантастика
космическая фантастика
рпг
попаданцы
5.00
рейтинг книги
Жертва