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