回 目 录
上 一 章 下 一 章

# 第十四章：其他特色

  现在你了解的函数足够可以写一个非常不错的CURSES程序了，而且你还可以加很多的花样。这里还有一些在很多情况下都很有用的函数，我们来看看其中一些函数吧。

### 14．1 curs_set()函数

  这个函数用来设制光标是否可见。它的参数可以是：0（不可见），1（可见），2（完全可见）

### 14．2 临时离开Curses模式

有时候你也许会想暂时离开CURSES模式，回到行缓冲模式下做些其他的事。在这种情况下，你首先要调用def_prog_mode()函数存储tty模式下的信息，然后使用end_win()函数退出CURSES模式。就可以回到最初的tty模式。如果想要恢复，就可以调用reset_prog_mode()函数，这个函数会通过被def_prog_mode()函数存储的信息重新读入虚拟的屏幕上，这时别忘了使用refresh()函数刷新，你才看到你真正回到了CURSES模式。让我们通过一个小例子了解一下这些函数的用法：

例12：临时离开模式

    #include <ncurses.h>

    int main()
    {
    	initscr();					/* 启动 CURSES模式 */
    	printw("Hello World !!!\n");		/* 打印 Hello World!!! */
    	refresh();					/* 让虚拟显示器的内容显示到屏幕上 */
    	def_prog_mode();				/* 存储当前tty模式 */
    	endwin();					/* 临时退出CURSES模式 */
    	system("/bin/sh");			/* 返回普通的行缓冲模式 */
    	reset_prog_mode();			/* 返回到def_prog_mode()存储的tty模式 */
    	refresh();					/* 使用 refresh() 函数恢复屏幕的内容 */
    	printw("Another String\n");		/* 完全返回CURSES模式 */
    	refresh();					/* 别忘了刷新屏幕 */
    	endwin();					/* 退出CURSES模式 */
    	return 0;
    }

### 14．3 ACS_变量

  如果你曾经在DOS下编写过程序，你应该知道扩展字符集。但是它们只能在某些终端上才是可以显示出来的。例如NCURSES的box()函数（译者注：这个函数用来绘制一个矩形框）就使用了这些字符。所有这些字符都是ACS_变量，所谓ACS，就是Alternative Character Set（可选字符集）。你可以注意到在以前的程序中多多少少都用到这些有意思的字符。这有一个程序分别介绍这些字符：

例13：ACS变量介绍例子

    #include <ncurses.h>

    int main()
    {
    	initscr();
    	printw("Upper left corner  		"); addch(ACS_ULCORNER); printw("\n");
    	printw("Lower left corner  		"); addch(ACS_LLCORNER); printw("\n");
    	printw("Lower right corner		"); addch(ACS_LRCORNER); printw("\n");
    	printw("Tee pointing right 		"); addch(ACS_LTEE); printw("\n");
    	printw("Tee pointing left 		"); addch(ACS_RTEE); printw("\n");
    	printw("Tee pointing up    		"); addch(ACS_BTEE); printw("\n");
    	printw("Tee pointing down		"); addch(ACS_TTEE); printw("\n");
    	printw("Horizontal line    		"); addch(ACS_HLINE); printw("\n");
    	printw("Vertical line       		"); addch(ACS_VLINE); printw("\n");
    	printw("Large Plus or cross over	"); addch(ACS_PLUS); printw("\n");
    	printw("Scan Line 1             	"); addch(ACS_S1); printw("\n");
    	printw("Scan Line 3             	"); addch(ACS_S3); printw("\n");
    	printw("Scan Line 7             	"); addch(ACS_S7); printw("\n");
    	printw("Scan Line 9        		"); addch(ACS_S9); printw("\n");
    	printw("Diamond         		"); addch(ACS_DIAMOND); printw("\n");
    	printw("Checker board (stipple)  	"); addch(ACS_CKBOARD); printw("\n");
    	printw("Degree Symbol           	"); addch(ACS_DEGREE); printw("\n");
    	printw("Plus/Minus Symbol   		"); addch(ACS_PLMINUS); printw("\n");
    	printw("Bullet             		"); addch(ACS_BULLET); printw("\n");
    	printw("Arrow Pointing Left       	"); addch(ACS_LARROW); printw("\n");
    	printw("Arrow Pointing Right      	"); addch(ACS_RARROW); printw("\n");
    	printw("Arrow Pointing Down        "); addch(ACS_DARROW); printw("\n");
    	printw("Arrow Pointing Up          "); addch(ACS_UARROW); printw("\n");
    	printw("Board of squares  		"); addch(ACS_BOARD); printw("\n");
    	printw("Lantern Symbol           	"); addch(ACS_LANTERN); printw("\n");
    	printw("Solid Square Block       	"); addch(ACS_BLOCK); printw("\n");
    	printw("Less/Equal sign           	"); addch(ACS_LEQUAL); printw("\n");
    	printw("Greater/Equal sign        	"); addch(ACS_GEQUAL); printw("\n");
    	printw("Pi                        	"); addch(ACS_PI); printw("\n");
    	printw("Not equal                 	"); addch(ACS_NEQUAL); printw("\n");
    	printw("UK pound sign            	"); addch(ACS_STERLING); printw("\n");
    	refresh();
    	getch();
    	endwin();
    	return 0;
    }

回 目 录
上 一 章 下 一 章