Linux下curses函數庫


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程序設計》

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM