日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Linux学习笔记13——使用curses函数库

發布時間:2024/6/21 综合教程 29 生活家
生活随笔 收集整理的這篇文章主要介紹了 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函数库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。