6.6 子窗口
介绍完多窗口后,我们来看一种多窗口的特例:子窗口。子窗口的创建和删除可以用以下几个函数来完成:
subwin函数的参数几乎与newwin函数完全一样,子窗口的删除过程也和其他窗口一样,都是通过调用delwin函数来完成。如同对待新窗口一样,你可以使用以mvw为前缀的函数来写子窗口。事实上,在大多数情况下,子窗口的行为与新窗口非常相似,两者之间只有一个重要的区别:子窗口没有自己独立的屏幕字符存储空间,它们与其父窗口(在创建子窗口时指定)共享同一字符存储空间。这意味着,对子窗口中内容的任何修改都会反映到其父窗口中,所以删除子窗口时,屏幕显示不会发生任何变化。
乍看起来,子窗口好像没有用处。为何不直接在父窗口中修改呢?子窗口最主要的用途是,提供了一种简洁的方式来卷动另一窗口里的部分内容。在编写curses程序时,我们经常会需要卷动屏幕的某个小区域。通过将这个小区域定义为一个子窗口,然后对其进行卷动,就能达到我们想要的效果。
使用子窗口有个强加的限制:在应用程序刷新屏幕之前必须先对其父窗口调用touchwin函数。
实 验 子窗口
现在你已看到了这些新函数,下面这个简短的例子将显示它们是如何工作的,以及它们与先前使用的窗口函数有何不同。
(1)首先是subsc1.c的初始化代码部分,它用一些文本初始化基本窗口的显示:
(2)现在创建一个新的卷动子窗口。根据前面的建议,必须在刷新屏幕之前对父窗口调用touchwin函数:
(3)接下来,删除子窗口中的内容,重新输出一些文字,然后刷新它。滚动文本是通过loop循环来实现的:
(4)循环结束后,删除子窗口,然后再次刷新基本屏幕:
图6-6是程序执行结束后,你看到的屏幕显示情况。
图 6-6
实验解析
在安排指针sub_window_ptr指向subwin函数调用的结果后,把子窗口设置为可卷动。即使在删除了子窗口和重新刷新了基本窗口(stdscr)之后,屏幕上的文本依然保持原来的样子,这是因为子窗口实际更新的是stdscr中的字符数据。