Основы программирования в Linux
<b>#include <curses.h></b><b>int mvwin(WINDOW *window_to move, int new_y, int new x);</b><b>int wrefresh(WINDOW *window_ptr);</b><b>int wclear(WINDOW *window_ptr);</b><b>int werase(WINDOW *window_ptr);</b><b>int touchwin(WINDOW *window_ptr);</b><b>int scrollok(WINDOW *window_ptr, bool scroll_flag);</b><b>int scroll(WINDOW *window_ptr);</b>Функция
перемещает окно по экрану. Поскольку окно целиком должно располагаться в области экрана, функцияmvwinзавершится аварийно, если вы попытаетесь переместить окно так, что какая-то его часть выйдет за пределы экрана.mvwinФункции
,wrefreshиwclear— просто обобщения функций, с которыми вы встречались ранее; они только принимают указательwerase, поэтому могут ссылаться на конкретное окно, а не на окно stdscr.WINDOWФункция
довольно специальная. Она информирует библиотеку curses о том, что содержимое окна, на которое указывает ее параметр, было изменено. Это означает, что curses всегда будет перерисовывать такое окно при следующем вызове функцииtouchwin, даже если вы на самом деле не меняли содержимое этого окна. Эта функция очень полезна для определения отображаемого окна при наличии нескольких перекрывающихся окон, загромождающих экран.wrefreshДве функции
управляют прокруткой окна. Функцияscrollпри передаче логического значения true (обычно ненулевого) включает прокрутку окна. По умолчанию окна не прокручиваются. Функцияscrollokпросто прокручивает окно на одну строку вверх. В некоторые реализации библиотеки curses входит и функцияscroll, которая также принимает количество строк для прокрутки, которое может быть и отрицательным числом. Мы вернемся к прокрутке немного позже в этой главе.wsctlА теперь выполните упражнение 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. Теперь создайте окно 10×20 и вставьте в него текст перед прорисовкой окна на экране:
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_ptra_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. Но если вы сначала воспользуетесь функцией
и заставите библиотеку curses думать, что окно было изменено, следующий вызов функции wrefresh снова отобразит новое окно на переднем плане.touchwintouchwin(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);