第3 章 cu rses 库窗口 ·1· 第3 章cu rses 库窗口 3.1 cu rses 窗口简介 3.1.1 窗口概念 窗口是 cu rses 库中最重要的一个组件,它实际上是屏幕上的一块矩形区域,在上面我们可以进行各种输出以及操作。cu rses 库中提供了大量的函数以允许我们创建和操作自己的窗口,而不仅仅是只能使用标准窗口stdscr。对自定义窗口进行操作的函数一般与对标准窗口进行操作的函数是相同的,除非它们需要特别的参数,这个参数通常为一个指向自定义窗口的指针。cu rses 也允许创建一种称之为基垫的窗口,英文名称为 pad。基垫的各个方面与窗口并无二异,只是它的大小和位置不再局限于终端屏幕的可视部分。它可以比标准屏幕大,位置也可以位于标准屏幕之外而我们看不到。因为窗口函数只是 cu rses 库函数的一部分,因此我们可以用同样的方法来编译使用窗口的程序。我们在这一章只介绍最常用的一些函数,必要时我们会给出几个综合的例子,从而加深对窗口的理解和应用能力。 窗口可以位于标准屏幕的任何位置,它们之间可以相互重迭包括与标准屏幕。窗口同时可以包含与它们相关联的子窗口。任何在父窗口和子窗口重迭区域的变化都会同时影响到它们中的任何一个。与子窗口类似,基垫也同样有子基垫,英文名称为 su bpad。子基垫是与父基垫相关联并且位于父基垫之内的窗口。刷新基垫和子基垫与刷新窗口和子窗口有些细微的差异。这种具体的差异我们在后面会慢慢介绍。 图 3.1 具体的演示了窗口、子窗口、基垫、子基垫之间的相互关系。 UNIX/Linux 下的CURSES 库开发指南 ·2· 图 3.1 3.1.2 窗口数据结构 在使用窗口之前我们先看一下窗口的数据结构定义,通常它在头文件 curses.h 中: typedef struct _win_st WINDOW; struct _win_st { short _cury, _curx; /* 光标当前位置 */ short _maxy, _maxx ; /* 最大的位置值 */ short _begy , _begx ; /* (0,0) 窗口相对于标准窗口的位置 */ char _flags ; short _yoffset ; /* 偏移量 */ bool _clear , /* clearok() 信息 */ _leave, /* leaveok() 信息 */ _immed, /* window in immediate mode */ _sync; /* auto syncup of parent */ WINDOW *_padwin; /* 当前窗口的”pad”区域*/ #ifdef _VR3_COMPAT_CODE _ochtype ** _y16; /* MUST stay at this offset in WINDOW */ ...