Книга: Основы программирования в Linux

Панели 

Панели 

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

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

Структура панели похожа на структуру WINDOW, и все функции библиотеки curses, написанные для работы с окнами, можно применять и к панелям. Но у панелей есть и собственные функции для создания и обновления.

Панели создаются во многом так же, как и обычные окна.

#include <curses.h>
WINDOW *newpad(int number_of_lines, int number_of_columns);

Обратите внимание на то, что возвращаемое значение — указатель на структуру типа WINDOW, такое же, как у функции newwin. Удаляются панели, как и окна, функцией delwin.

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

#include <сurses.h>
int prefresh(WINDOW *pad_ptr, int pad_row, int pad_column, int screen_row_min, int screen_col_min, int screen_row_max, int screen_соl_max);

Функция выполняет запись области панели, начинающейся в точке (pad_row, pad_column), в область экрана, определенную от (screen_row_min, screen_col_min) до (screen_row_max, screen_col_max).

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

Давайте проверим это на практике с помощью программы pad.с (упражнение 6.8).

Упражнение 6.8. Применение панели

1. В начале этой программы вы инициализируете структуру панели и затем формируете панель с помощью функции, которая возвращает указатель на нее. Вставьте символы, заполняющие структуру панели (панель на 50 символов шире и выше экрана терминала):

#include <unistd.h>
#include <stdlib.h>
#include <curses.h>
int main() {
 WINDOW *pad_ptr;
 int x, y;
 int pad_lines;
 int pad_cols;
 char disp_char;
 initscr();
 pad_lines = LINES + 50;
 pad_cols = COLS + 50;
 pad_ptr = newpad(pad_lines, padcols);
 disp_char = 'a';
 for (x = 0; x < pad_lines; x++) {
  for (у = 0; у < pad_cols; y++) {
   mvwaddch(pad_ptr, x, y, disp_char);
   if (disp_char == 'z') disp_char = 'a';
   else disp_char++;
  }
 }

2. Теперь перед завершением программы нарисуйте разные области панели в разных местах экрана:

 prefresh(pad_ptr, 5, 7, 2, 2, 9, 9);
 sleep(1);
 prefresh(pad_ptr, LINES + 5, COLS + 7, -5, 5, 21, 19);
 sleep(1);
 delwin(pad_ptr);
 endwin();
 exit(EXIT_SUCCESS);
}

Выполнив эту программу, вы увидите нечто подобное показанному на рис. 6.8.


Рис. 6.8

Оглавление книги


Генерация: 1.644. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз