Linux学习笔记13——使用curses函数库
一 安裝curses庫(kù)
如果你的Linux系統(tǒng)中curses庫(kù),直接敲入命令sudo apt-get install libncurses5-dev,然后就會(huì)自動(dòng)安裝curses庫(kù),安裝好之后敲入命令:
ls -l /usr/include/*curses.h,我上面顯示的是這樣:
二 curses庫(kù)有什么作用
curses函數(shù)庫(kù)能夠優(yōu)化光標(biāo)的移動(dòng)并最小化需要對(duì)屏幕進(jìn)行的刷新,從而也減少了必須向字符終端發(fā)送的字符數(shù)目。
三 認(rèn)識(shí)curses庫(kù)
1:curses函數(shù)庫(kù)用兩個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)映射終端屏幕,它們是stdscr和curscr。
stdscr數(shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)的是標(biāo)準(zhǔn)屏幕(在窗口下,這個(gè)一般作為窗口的指針)
curscr對(duì)應(yīng)的是當(dāng)前屏幕
2:所有的curses函數(shù)使用的坐標(biāo)都是y值(行號(hào))在前,x值(列號(hào))在后。每個(gè)位置不僅包含該屏幕位置處的字符,還包含它的屬性。
3:所有的curses程序必須以initscr函數(shù)開(kāi)始,以endwin函數(shù)結(jié)束
#include <curses.h> WINDOW *initscr(void);//initscr函數(shù)在一個(gè)程序中只能調(diào)用一次,如果成功,它返回一個(gè)指向stdscr結(jié)構(gòu)的指針;如果失敗,它就輸出一條診斷錯(cuò)誤信息并使程序退出 int endwin(void);
4 輸出到屏幕
#include <curses.h> int addch(const chtype char_to_add); //在光標(biāo)的當(dāng)前位置添加指定的字符
int addchstr(chtype *const string_to_add); //在光標(biāo)的當(dāng)前位置添加指定的字符串
int printw(char *format,...); //對(duì)字符串進(jìn)行格式化,然后將其添加到光標(biāo)的當(dāng)前位置 int refresh(void); //刷新物理屏幕 int box(WINDOW *win_ptr,chtype vertical_char,chtype horizontal_char); //圍繞一個(gè)窗口繪制方框 int insch(chtype char_to_insert); //插入一個(gè)字符 int insertln(void); //插入一個(gè)空白行 int delch(void); //刪除一個(gè)字符 int deleteln(void); //刪除一個(gè)空白行 int beep(void); //發(fā)出蜂鳴 int flash(void); //使屏幕閃爍
5 從屏幕讀取
#include <curses.h> chtype inch(void); //返回光標(biāo)當(dāng)前位置的字符及其屬性信息
6 清除屏幕
#include <curses.h> int erase(void); //在每個(gè)屏幕位置寫上空白字符 int clear(void); //清除整個(gè)屏幕,而不是嘗試刪除當(dāng)前屏幕上每個(gè)非空白的位置 int clrtobot(void); //清除當(dāng)前坐標(biāo)位置直到屏幕結(jié)尾的所有內(nèi)容 int clrtoeol(void); //清除當(dāng)前坐標(biāo)位置直到坐標(biāo)所處行行尾的所有內(nèi)容
7 移動(dòng)坐標(biāo)
#include <curses.h> int move(int new_y,int new_x); //移動(dòng)邏輯光標(biāo) int leaveok(WINDOW *window_ptr,bool leave_flag); //leave_flag默認(rèn)為false,表示硬件光標(biāo)將停留在邏輯光標(biāo)所處的位置,
//如果該標(biāo)志被設(shè)置為true,則硬件光標(biāo)會(huì)被隨機(jī)的放置在屏幕上的任意位置
8 字符屬性
#include <curses.h> int attron(chtype attribute); //啟用指定的屬性 int attroff(chatype attribute); //關(guān)閉指定的屬性 int attrset(chtype attribute); int standout(void); int standend(void);
預(yù)定義的屬性有:A_BLINK A_BOLD A_DIM A_REVERSE A_STANDOUT 和A_UNDERLINE
9 鍵盤輸入
#include <curses.h> int getch(void); int getstr(char *string); //對(duì)返回的字符串的長(zhǎng)度沒(méi)有限制 int getnstr(char *string,int number_of_characters); //對(duì)返回的字符串長(zhǎng)度有限制,盡量用這個(gè)函數(shù)取代getstr函數(shù) int scanw(char *format,...);
10 窗口
#include <curses.h>
WINDOW *newwin(int num_of_lines, //行數(shù)
int num_of_cols, //列數(shù)
int start_y, //起始坐標(biāo)y值
int start_x //起始坐標(biāo)x值
); //創(chuàng)建窗口,如果新窗口的任何部分落在當(dāng)前屏幕范圍之外,則newwin函數(shù)調(diào)用將失敗
int delwin(WINDOW *window_to_delete); //刪除窗口
11 關(guān)于加前綴
如果給函數(shù)增加了w前綴,就必須在該函數(shù)的參數(shù)表的最前面增加一個(gè)WINDOW指針參數(shù)
如果給函數(shù)增加的是mv前綴,則需要在函數(shù)的參數(shù)表的最前面增加兩個(gè)參數(shù),分別是縱坐標(biāo)y和橫坐標(biāo)x,坐標(biāo)值y和x是相對(duì)于窗口的
如果給函數(shù)增加了mvw前綴,就需要多傳遞3個(gè)參數(shù),分別是一個(gè)WINDOW指針,y和x坐標(biāo)值
12 移動(dòng)和更新窗口
#include <curses.h> int mvwin(WINDOW *window_to_move,int new_y,int new_y); //在屏幕上移動(dòng)一個(gè)窗口 int wrefresh(WINDOW *window_ptr); int wclear(WINDOW *window_ptr); int werase(WINDOW *window_ptr); //wrefresh,wclear,werase分別是前面refresh,clear,erase的通用版本 int touchwin(WINDOW *window_ptr); //通知curses函數(shù)庫(kù)其指針參數(shù)指向的窗口內(nèi)容已發(fā)生改變 int scrollok(WINDOW *window_ptr,bool scroll_flag); //如果scroll_flag為true,則允許窗口卷屏 int scroll(WINDOW *window_ptr); //把窗口內(nèi)容上卷一行
13 優(yōu)化屏幕刷新
#include <curses.h> int wnoutrefresh(WINDOW *window_ptr); //決定哪些字符發(fā)送到屏幕上,但是不真正發(fā)送 int doupdate(void); //將更新發(fā)送到終端,效果和wrefresh一樣
14 子窗口
#include <curses.h> WINDOW *subwin(WINDOW *parent,int num_of_lines,int num_of_cols,int start_y,int start_x); //創(chuàng)建子窗口 int delwin(WINDOW *window_to_delete); //刪除子窗口
子窗口和新窗口之間的區(qū)別:子窗口沒(méi)有自己獨(dú)立的屏幕字符存儲(chǔ)空間,它們與其父窗口共享同一字符存儲(chǔ)空間,因此對(duì)子窗口中內(nèi)容的任何修改都會(huì)反映到其父窗口中
子窗口的用途:提供了一種簡(jiǎn)潔的方式來(lái)卷動(dòng)另一個(gè)窗口里的部分內(nèi)容
對(duì)子窗口的限制:在應(yīng)用程序刷新屏幕之前必須先對(duì)其父窗口調(diào)用touchwin函數(shù)
15 keypad模式
#include <curses.h> int keypad(WINDOW *window_ptr,bool keypad_on); //keypad_on為true時(shí),開(kāi)啟keypad模式
在keypad模式下,curses將接管按鍵轉(zhuǎn)義序列的處理工作,該鍵盤操作不僅能夠返回用戶按下的鍵,還將返回與邏輯按鍵對(duì)應(yīng)的KEY_定義
16 彩色顯示
在使用curses函數(shù)庫(kù)的顏色功能之前,必須檢查當(dāng)前終端是否支持彩色顯示功能,然后對(duì)curses的顏色例程進(jìn)行初始化
#include <curses.h> bool has_colors(void); int start_color(void);//has_colors函數(shù)返回true時(shí)在調(diào)用這個(gè)函數(shù)
顏色組合:在使用curses的顏色功能時(shí),必須同時(shí)定義一個(gè)字符的前景色和背景色
在把顏色作為屬性使用之前,必須首先調(diào)用init_pair函數(shù)對(duì)準(zhǔn)備使用的顏色組合進(jìn)行初始化
#include <curses.h> int init_pair(short pair_number, //顏色對(duì)的編號(hào) short foreground, //前景色 short background); //背景色 int COLOR_PAIR(int pair_number); //使用指定的著色方式 int pair_content(short pair_number,short *foreground,short *background); //獲取已定義的顏色組的信息
例如:init_pair(1,COLOR_RED,COLOR_GREEN); //顏色都是以COLOR_開(kāi)頭
wattron(window_ptr,COLOR_PAIR(1)); //將該顏色組合作為屬性來(lái)訪問(wèn),把屏幕上后續(xù)添加的內(nèi)容設(shè)置為綠色背景上的紅色內(nèi)容
17 pad
#include<curses.h> WINDOW *newpad(int number_of_lines,int number_of_columns); //創(chuàng)建pad int prefresh(WINDOW *Pad_ptr,
int pad_row,
int pad_column,
int screen_row_min,
int screen_col_min,
int screen_row_max,
int screen_col_max );//指定希望放到屏幕上的pad范圍及其在屏幕上的位置
18 編譯時(shí),需要在命令后面加上-lcurses,否在會(huì)出現(xiàn)“undefined reference to”的錯(cuò)誤。
總結(jié)
以上是生活随笔為你收集整理的Linux学习笔记13——使用curses函数库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 12星座密码锁(完整的手势密码模式集合)
- 下一篇: NIO 简介