在 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 功能。垫子接缝不必要地笨重,对我来说减少了。
我在标准屏幕的顶部创建了 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 功能。垫子接缝不必要地笨重,对我来说减少了。