Я создаю 3 окна поверх стандартного экрана, со столбцами ширины экрана и высотой одной строки:
WINDOW* pWindow = newwin(0, COLS - 1, windowNr, 0); // windowNr 0 - 2
Что обычно отображается как последовательные окна:
----------------------------0 Window----------------------------
----------------------------1 Window----------------------------
----------------------------2 Window----------------------------
Моя проблема в последнем созданном окне. Мне нужна панель, которую я создаю. с участием:
WINDOW* pPad = newpad(LINES - 3, COLS - 1); // 3 because of the three pWindows
Но pad
отображается прежде всего pWindows
:
----------------------------0 Pad----------------------------
----------------------------0 Pad----------------------------
----------------------------0 Pad----------------------------
Как я могу расположить панель под последним окном, в котором выводится:
----------------------------0 Window----------------------------
----------------------------1 Window----------------------------
----------------------------2 Window----------------------------
------------------------------0 Pad-----------------------------
------------------------------0 Pad-----------------------------
------------------------------0 Pad-----------------------------
К сожалению, у newpad
нет координат (y, x), как у newwin
. Чтобы просто заполнить панель отладочным содержимым, я делаю:
werase(pPad); // Clear window, https://invisible-island.net/ncurses/man/curs_clear.3x.html
wmove(pPad, 0, 0); // Moves cursor in pad to y,x
for(int c = 0; c < 40; c++){
string s = to_string(c) + ".\n";
wprintw(pPad, s.c_str());
}
prefresh(pPad, 0, 0, 0, 0, maxRows, maxCols);
Я также устанавливаю разные значения в prefresh
, его прокрутка или, скорее, обновление области просмотра работает идеально, как описано в документации.
@ThomasDickey, я не знаю, разрешено ли это или является хорошей практикой, как говорится в документах invisible-island.net/ncurses/man/curs_pad.3x.htmlThe subpad routine creates and returns a pointer to a subwindow within a pad with the given number of lines, nlines, and columns, ncols.
в блокноте заставляет меня задуматься. Но ваш ответ дал мне другое представление, смотрите мой принятый ответ, который я собираюсь написать.
Почему понижение оценки вопроса?
Я храню содержимое pad
в памяти и отображаю только одно окно как:
----------------------------0 Window----------------------------
----------------------------1 Window----------------------------
----------------------------2 Window----------------------------
----------------------------3 Window----------------------------
----------------------------3 Window----------------------------
----------------------------3 Window----------------------------
Это позволяет имитировать панель, поскольку в 3 Window
только точка обзора моих данных отображается в виде линий. Прокрутку можно смоделировать, изменив диапазон или индекс в моей структуре данных и повторно визуализировав только одну 3 Window
строку, если она была выбрана, и все окно, если прокрутить или уменьшить индекс окна просмотра памяти. Таким образом, блокнот имитируется, и я избегаю различных вызовов ncurses, таких как prefresh, pnoutrefresh, pechochar
и т. д., И могу использовать только вызовы окна, wrefresh
. Например, прокрутка вниз изменит:
----------------------------3 Window-index 0--------------------
----------------------------3 Window-index 1--------------------
----------------------------3 Window-index 2--------------------
к
----------------------------3 Window-index 1--------------------
----------------------------3 Window-index 2--------------------
----------------------------3 Window-index 3--------------------
и так далее и тому подобное. В ncurses API Windows имеет больше функций, я также могу использовать их все вместо возможных будущих ограничений, используя pads
сейчас.
Я уверен, что у автора ncurses были свои причины, но я бы только сделал API ncurses с одним типом окна с флагом для включения функциональности панели. Подушечки швом излишне громоздки и укорочены для меня.
Вы можете попробовать
subpad
(в окне), а неnewpad
.