curses 滚动窗口实现 - HeavyYuan/A-CD-Record-Management-System GitHub Wiki

实现如图界面

subwin box

图片地址:https://github.com/HeavyYuan/A-CD-Record-Management-System/blob/master/pics/subwin_box.png

实现方法

  1. 创建两个子窗口,box_win_ptr和sub_win_ptr
  2. box_win_ptr上画出窗口的边界
  3. sub_win_ptr作为真正的内容输出子窗口
  4. 对sub_win_ptr使能滚动特性,并且在指定条件下做滚动动作

实现代码见commit:15e480d36ba5a64058b67953265bad5e9abbb900 - 函数:add_track_ui

问题

1. 为什么要用2个而不是1个子窗口?

边界线是box绘制的,边界线是绘制在子窗口上的,其也相当于子窗口中的内容输出。

绘制边界后,子窗口的输出行和列各减2。

只用一个子窗口的情况下(开启了scroll),边界线也会被scrolling掉。

所以用两个子窗口,一个用来绘制边界线,一个用来真正的内容输出。

2. 既然开启了滚动特性(scrolling),为什么要人为实现在指定条件下做滚动动作?

对于一个5行6列,并且使能了滚动特性的子窗口,其能显示输出的行就5行,而不是任意多行

向上滚动将屏幕向上提一行,第一行就不可见了,最后一行是新行,但是其行坐标是4,并不是5,所以此时在新行中输出,需要指定行坐标为4。

因而会出现以下情况:

在上述子窗口中打印信息时,我们的逻辑是在输入不为空时,一直给出输入track信息的打印,所以输出的行坐标要增加,当增加到大与4时

会看到光标在子窗口底部,但是没有提示信息打印了,因为此时输出行坐标大于4。