1.安裝
ubuntu11.10下默認沒有安裝curses函數庫,(CentOS下默認已經安裝,可以直接在usr/include下查看是否有該頭文件來確定)使用
>sudo apt-get install ncurses-dev
安裝curses庫,這樣在curses函數庫的頭文件和庫文件就被分別安裝在/usr/include/和/usr/lib/下,在編譯程序時,直接使用命令:
gcc program.c -o program -lcurses
完成編譯,運行。
2.curses術語和概念
curses工作在屏幕,窗口和子窗口之上。屏幕是設備全部可用顯示面積(對終端是該窗口內所有可用字符位置),窗口與具體例程有關。如基本的stdscr窗口等。
curses使用兩個數據結構映射終端屏幕,stdscr和curscr。stdscr是“標准屏幕”(邏輯屏幕),在curses函數庫產生輸出時就刷新,是默認輸出窗口(用戶不會看到該內容)。curscr是“當前屏幕”(物理屏幕),在調用refresh函數是,函數庫會將curscr刷新為stdscr的樣子。
使用initscr();和endwin();兩個函數對函數庫進行初始化和重置。
#include<curses.h> WINDOW *initscr(void); int endwin(void);
3.屏幕
函數基本分為如下幾類:
輸出到屏幕:
1 int addch(const chtype char_to_add); 2 int addchstr(chtype *const string_to_add); //當前位置添加字符(串) 3 4 int printw(char *format, ...); //類似與printf 5 int refresh(void); //刷新物理屏幕 6 int box(WINDOW *win_ptr, chtype vertical, chtype horizontal); //圍繞窗口繪制方框 7 int insch(chtype char_to_insert); //插入一個字符(已有字符后移) 8 int insertln(void); //插入空白行 9 int delch(void); 10 int deleteln(void); //刪除字符和空白行 11 12 int beep(void); //終端響鈴 13 int flash(void); //閃爍
從屏幕讀取字符;
1 chtype inch(void); //返回光標位置字符 2 int instr(char *string); // 3 int innstr(char *string, int numbers); //將返回內容寫入字符數組中
清除屏幕;
int erase(void); //在屏幕的每個位置寫上空白字符 int clear(void); //使用一個終端命令來清除整個屏幕,內部調用了clearok來執行清屏操作,(在下次調用refresh時可以重現屏幕原文) int clrtobot(void); //清除光標位置到屏幕結尾的內容 int clrtoeol(void); //清除光標位置到該行行尾的內容
移動光標;
int move(int new_y, int new_x); //移動stdcsr的光標位置
字符屬性(指對字符設置加粗,反色顯示等);
預定義的屬性:A_BLINK, A_BOLD, A_DIM, A_REVERSE, A_STANDOUT, A_UNDERLINE.
int attron(chtype attribute); int attroff(chtype attribute); //啟用或關閉某屬性 int attrset(chtype attribute); int standout(void); int standend(void); //這兩個表示更加通用的強調模式,通常映射為反白顯示
4.鍵盤
鍵盤模式:
int echo(); int noecho(); //用於開啟和關閉鍵盤輸入字符的回顯 //完成initscr后,輸入模式為預處理模式,(1)所有處理是基於行的,就是說,只有按下回車,輸入數據才被傳給程序;(2)鍵盤特殊字符啟用,按下合適組合鍵會產生信號 int cbreak(); //設置cbreak模式,字符一鍵入,直接傳給程序 int nocbreak(); //關閉 int raw(); //關閉特殊字符處理 int noraw(); //同時回復默認模式和特殊字符處
鍵盤輸入:
//與標准io庫的getchar, gets, scanf類似 int getch(); int getstr(char *string); int getnstr(char *string, int number); //建議使用 int scanw(char*format,...);
5.窗口
curses函數庫支持在一個物理屏幕上顯示多個窗口。
5.1 WINDOW結構
從前面initscr返回可以看到,標准屏幕stdscr實際上就是WINDOW結構的,它的作用類似與標准輸出stdout。所以可以使用下面函數自己創建和銷毀窗口。
WINDOW *newwin(int lines, int cols, int start_y, int start_x); //創建從(start_y, start_x)開始的lines行,cols列的窗口。 int delwin(WINDOW *window); //銷毀上面創建的窗口,千萬不要刪除stdscr和curscr!
當lines和cols為0時,說明新窗口右下角落在屏幕右下角上。
5.2 通用函數
前面的addch和printw函數用於在屏幕上增加字符,它們都可以通過增加前綴變為通用函數。
前綴w用於窗口(添加一個WINDOWS指針參數),mv用於光標移動(在該位置執行操作addch或printw)(添加兩個坐標值參數),mvw用於在窗口中移動光標。組成如下函數:
addch, waddch, mvaddch, mvwaddch
printw, wprintw, mvprintw, mvwprintw
5.3移動和更新窗口
int mvwin(WINDOW *win, int new_y, int new_x); //移動窗口 int wrefresh(WINDOW *win); int wclear(WINDOW *win); int werase(WINDOW *win); //類似於上面的refresh, clear, erase,但是此時針對特定窗口操作,而不是strcsr int touchwin(WINDOW *win); //指定該窗口內容已改變 int scrollok(WINDOW *win, bool flag); //指定是否允許窗口卷屏 int scroll(WINDOW *win); //把窗口內容上卷一行
6.子窗口
WINDOW *subwin(WINDOW *parent, int lines, int cols, int start_y, int start_x); //創建子窗口。 int delwin(WINDOW *window); //銷毀子窗口
子窗口除了沒有自己的屏幕字符存儲空間外,其他與新窗口相同。
主要用於卷動另一窗口只能個的部分內容,將這部分區域設為子窗口,然后卷動即可
7.keypad模式
第4部分看到了curses提供了處理鍵盤的功能。另外,鍵盤一般還會有方向鍵,功能鍵,數字小鍵盤,Insert, Home等按鍵。這些鍵會發送以"\"(轉義字符)開頭的字符串序列。解碼這些鍵就要區分“單獨按下\鍵”和“按下功能鍵而產生\開頭的字符串序列”,
在curses函數庫中,頭文件curses.h提供了一組以KEY_為前綴的定義來管理邏輯鍵。
curses在啟動時會 關閉轉義序列與邏輯鍵之間的轉換功能,需要調用如下函數開啟:
int keypad(WINDOW *win, bool keypad_on); //keypad_on參數為true時,啟用keypad模式。此時讀鍵盤操作能夠返回 用戶在按下邏輯鍵時對應的KEY_定義
8.彩色顯示
curses能顯示簡單的彩色。必須同時定義一個字符的前景色和背景色,稱為顏色組合。使用方法如下:
首先,檢查終端是否支持彩色顯示,然后對curses顏色例程初始化:
bool has_colors(void); int start_color(void);
若start_color成功返回OK,變量COLORS定義為可用顏色數目,一般為8種,COLOR_PAIRS定義為可用顏色組合數目,一般為64種。
int init_pair(shor pair_number, short foreground, short background); //初始化pair_number號顏色組合 int COLOR_PAIR(int pair_number); //對pair_number號顏色組合作為屬性來訪問(用於前面的attr函數) int pair_content(short pair_number, short *foreground, short *background); //獲取已定義的顏色組合信息
更詳細的參考:http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/——《NCURSES Programming HOWTO》
http://invisible-island.net/ncurses/man/ncurses.3x.html——ncurses
參考:Beginning Linux Programming, 《Linux程序設計》