curses 环境中的 Windows
curses 程序操作出现在终端显示器上的窗口。 窗口在长度和高度上可以大至整个显示器,或小至单个字符。
在 curses 程序中,窗口是声明为类型 WINDOW 的变量。 在 /usr/include/curses.h 文件中,WINDOW 数据类型被定义为 C 数据结构。 通过为窗口结构分配机器内存的一部分来创建窗口。 此结构描述了窗口的特征。 当程序在内存中内部更改窗口数据时,它必须使用 wrefresh 子例程(或等价子例程)来更新外部、物理屏幕以反映相应窗口结构中的内部更改。
缺省窗口结构
curses 提供被称作 stdscr 的虚拟缺省窗口结构。 stdscr 在内存中表示整个终端显示器。 stdscr 窗口结构是在初始化 curses 库时自动创建的,并且它描述显示。 初始化库时,将 length 和 width 变量设为物理显示器的长度和宽度。
使用 stdscr 的程序首先操作 stdscr。 然后它们可以调用 refresh 子例程刷新外部显示器,使其与 stdscr 窗口一致。
除了 stdscr,您也可定义自己的窗口。 这些窗口称为用户定义的窗口,与 stdscr 有所区分。 如同 stdscr,用户定义的窗口在机器内存中作为结构存在。 除可用于程序的内存量之外,对可创建的窗口数目没有任何限制。 curses 程序可操作缺省窗口和/或用户定义的窗口。
当前窗口结构
curses 支持另一个虚拟窗口,该窗口称为 curscr(当前屏幕)。 curscr 为当前出现在终端外部显示器上内容的内部表示。
当程序要求外部表示与内部表示匹配时,它必须调用子例程 (例如 wrefresh 子例程) 来更新物理显示 (或者 refresh 子例程 (如果程序正在使用 stdscr))。
curses 将 curscr 保留起来以备内部使用。 不要操作 curscr。
子窗口
curses 还允许您构造子窗口。 子窗口是位于其他窗口内部的矩形部分。 子窗口的类型也是 WINDOW。 包含子窗口的窗口称为子窗口的父窗口,而此子窗口称为该包含窗口的子窗口。
在子窗口重叠区域中更改父窗口或子窗口都将对这两个窗口进行更改。 修改子窗口后,在刷新父窗口之前请调用 touchline 或 touchwin 子例程。
| 子例程 | 描述 |
|---|---|
| 接触线 | 强制在下一次调用 wrefresh 子例程时刷新一系列行。 |
| touchwin | 在下次调用 wrefresh 子例程时,强制刷新窗口字符数组中的每一个字符。 touchwin 子例程不保存优化信息。 对于重叠窗口,此子例程很有用处。 |
在父窗口上调用刷新也将刷新子窗口。 子窗口也可以是父窗口。 将窗口重叠在窗口内的过程称为嵌套。
必须先使用 delwin 子例程删除其所有子代,然后才能删除父窗口。 如果在先删除其所有子窗口之前试图删除窗口,那么 curses 将返回错误。
pad
pad 是一种窗口类型,这类窗口不受终端显示器大小的限制,或者不与显示器的特殊部分关联。 由于 pad 通常要大于物理显示器,所以仅有部分 pad 在给定时间可被用户看到。
如果想要将大量相关数据一起保存到一个窗口而又不需要一次显示所有数据,请使用 pad。
焊盘内的窗口称为子焊盘。 子 pad 位于 pad 内与父 pad 相关的坐标处。 这一布局不同于子窗口,后者是使用屏幕坐标定位的。
不同于其他窗口,滚动或回传输入将不自动刷新 pad。 与子窗口一样,更改子 pad 的映像时,必须在刷新父 pad 之前在父 pad 上调用 touchline 或 touchwin 子例程。
可将除 newwin、subwin、wrefresh 和 wnoutrefresh 子例程之外的所有 curses 子例程用于 pad。 这些子例程将替换为 newpad, subpad, prefresh和 pnoutrefresh 子例程。