在 c++ 中,ncurses 中的 window 下方的 pad 位置

Position in ncurses a pad below a window in c++

我在标准屏幕的顶部创建了 3 个 windows,具有屏幕宽度的列和一个行高:

WINDOW* pWindow = newwin(0, COLS - 1, windowNr, 0); // windowNr 0 - 2

通常呈现为相应的 windows:

----------------------------0 Window----------------------------
----------------------------1 Window----------------------------
----------------------------2 Window----------------------------

我的问题是在最后创建的 window 我想要一个我创建的垫 有:

WINDOW* pPad = newpad(LINES - 3, COLS - 1); // 3 because of the three pWindows

但是pad首先渲染pWindows:

----------------------------0 Pad----------------------------
----------------------------0 Pad----------------------------
----------------------------0 Pad----------------------------

如何将焊盘定位在最后一个 window 下方,输出为:

----------------------------0 Window----------------------------
----------------------------1 Window----------------------------
----------------------------2 Window----------------------------
------------------------------0 Pad-----------------------------
------------------------------0 Pad-----------------------------
------------------------------0 Pad-----------------------------

不幸的是,newpad 没有 newwin 那样的 (y,x) 坐标。为了简单地用调试内容填充 pad,我这样做:

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 中添加了不同的值,它的视口滚动或更确切地说是刷新效果如文档中所述完美。

我将 pad 内容保存在内存中,只渲染一个 window 为:

----------------------------0 Window----------------------------
----------------------------1 Window----------------------------
----------------------------2 Window----------------------------
----------------------------3 Window----------------------------
----------------------------3 Window----------------------------
----------------------------3 Window----------------------------

这可以模拟一个 pad,因为在 3 Window 中只有我的数据的视点被渲染为线。可以通过更改我的数据结构中的范围或索引来模拟滚动,如果选择了一行,则仅重新呈现一个 3 Window 行,如果滚动到或减少内存视口索引,则重新呈现整个 window 行。这样就可以模拟 pad,我避免了不同的 ncurses 调用,如 prefresh, pnoutrefresh, pechochar 等,并且只能使用 window、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,其中一个 window 类型带有一个标志以启用 pad 功能。垫子接缝不必要地笨重,对我来说减少了。