操作窗口与基板

通常在使用curses.initscr()函数之后,将获取一个代表全屏幕的窗口对象。但是一般在使用Curses时,经常会在屏幕上划分出若干小区域,即小窗口,来供使用。

窗口可以使用.newwin()方法来创建,其格式为curses.newwin(高, 宽, 左上角y坐标, 左上角x坐标)。这里需要注意的是,由于Curses库的习惯,在描述宽高及坐标时,都是纵轴在前,横轴在后,也就是说,先描述竖向属性,再描述横向属性。

为了减少重绘,在输出文字时,Curses会先进行操作的积累,并在适当的时刻去绘制内容。如果需要立刻重绘窗口,需要调用窗口的.refresh()函数。

基板的创建与窗口相似,因为基板是一种特殊的窗口。基板的可以显示的面积比窗口大得多,所以其创建时只需要指定宽高即可,并不需要提供位置。但是在其使用.refresh()函数进行强制重绘时,则必须指定显示位置与显示区域,即.refresh(基板起始行, 基板起始列, 屏幕起始行, 屏幕起始列, 屏幕结束行, 屏幕结束列)。基板的重绘将把基板上指定位置开始的内容直接绘制在屏幕的指定位置。

当屏幕上有多个窗口或者基板,刷新其中一个窗口或者基板时会造成屏幕的闪烁,这可以在每个窗口上调用.noutrefresh()函数。该函数可以将窗口标记为待重绘,要完成重绘,需要调用curses.doupdate()函数完成重绘。

窗口和基板可以放置在其他窗口和基板之上,要实现这样的效果可以使用.overlay(目标窗口)函数,该函数最简单的使用方法就是直接指定要被覆盖的窗口。两个窗口的大小并不一定要完全一样。更高级的使用方式是部分覆盖,这需要指定额外的六个参数来确定覆盖范围。

在计算窗口内容输出位置时,常常会需要取得窗口左上角的坐标以及窗口的宽高。Curses库在窗口类中提供了两个方法来完成这两项任务,首先.getbegyx()是用来获取窗口左上角的坐标的,其返回值为一个元组,其次.getmaxyx()是用来获取窗口的最大可用宽高的,其返回值同样是一个元组。这里要注意的是,返回的元组的第一个值同样是纵向属性,第二个值为横向属性。