ncurses其他特性:curs_set(),離開curses模式,ACS_擴充套件字符集,擴充套件庫

Koma_Wong發表於2018-06-22
  • Copyright(C) NCURSES Programming HOWTO

其它特色

現在你所掌握的函式可以寫出一個非常不錯的curses 程式了。這裡還有一些很有趣的函式可以為你的程式增色。

curs_set()函式

這個函式用來設制游標是否可見。它的引數可以是:0(不可見),1(可見),2(完全可見)

臨時離開Curses 模式

有時候你也許會想暫時離開curses 模式,回到行緩衝模式下做些其它的事。在這種情況下,你首先要呼叫def_prog_mode()函式儲存tty 模式下的資訊,然後使用end_win()函式退出curses 模式,讓你回到最初的tty 模式。如果你結束了tty 模式下的工作,想要返回curses模式,就需要呼叫reset_prog_mode()函式,它會將def_prog_mode()函式儲存的資訊重新讀入到虛擬的螢幕上。之後必須通過refresh()函式重新整理螢幕,才可以返回到原先儲存的curses 模式。讓我們通過一個小例子瞭解一下這些函式的用法:

例:臨時離開模式

/*
Compile: gcc main.c -lncurses
*/
#include <ncurses.h>

int main()
{
    initscr();                      /* 啟動CURSES 模式*/
    printw("Hello World !!!\n");    /* 列印Hello World!!! */
    refresh();                      /* 讓虛擬顯示器的內容顯示到螢幕上*/
    def_prog_mode();                /* 儲存當前tty 模式*/
    endwin();                       /* 臨時退出CURSES 模式*/
    system("sh");                   /* 返回普通的行緩衝模式*/
    reset_prog_mode();              /* 返回到def_prog_mode()儲存的tty 模式*/
    refresh();                      /* 使用refresh() 函式恢復螢幕的內容*/
    printw("Another String\n");     /* 完全返回CURSES 模式*/
    refresh();                      /* 別忘了重新整理螢幕*/
    endwin();                       /* 退出CURSES 模式*/
    return 0;
}

ACS_常量

如果你曾經在DOS 下編寫過程式,就應該知道擴充套件字符集。但是這些字符集中的字元只能在少數的終端上顯示。例如NCURSES 的box()函式(譯者注:這個函式用來繪製一個矩形框)就使用了這些擴充套件字元。所有這些字元都是以ACS_作為字首的常量,所謂ACS,就是Alternative Character Set(可選字符集)的縮寫。你可以注意到在以前的程式中多多少少都用到了這些有意思的字元。下面這個程式分別介紹這些字元:

例:ACS 常量介紹例子

/*
Compile: gcc main.c -lncurses
*/
#include <ncurses.h>
int main()
{
    initscr();
    printw("Upper left corner ");           addch(ACS_ULCORNER);    printw("\n");
    printw("Lower left corner ");           addch(ACS_LLCORNER);    printw("\n");
    printw("Lower right corner ");          addch(ACS_LRCORNER);    printw("\n");
    printw("Tee pointing right ");          addch(ACS_LTEE);        printw("\n");
    printw("Tee pointing left ");           addch(ACS_RTEE);        printw("\n");
    printw("Tee pointing up ");             addch(ACS_BTEE);        printw("\n");
    printw("Tee pointing down ");           addch(ACS_TTEE);        printw("\n");
    printw("Horizontal line ");             addch(ACS_HLINE);       printw("\n");
    printw("Vertical line ");               addch(ACS_VLINE);       printw("\n");
    printw("Large Plus or cross over ");    addch(ACS_PLUS);        printw("\n");
    printw("Scan Line 1 ");                 addch(ACS_S1);          printw("\n");
    printw("Scan Line 3 ");                 addch(ACS_S3);          printw("\n");
    printw("Scan Line 7 ");                 addch(ACS_S7);          printw("\n");
    printw("Scan Line 9 ");                 addch(ACS_S9);          printw("\n");
    printw("Diamond ");                     addch(ACS_DIAMOND);     printw("\n");
    printw("Checker board (stipple) ");     addch(ACS_CKBOARD);     printw("\n");
    printw("Degree Symbol ");               addch(ACS_DEGREE);      printw("\n");
    printw("Plus/Minus Symbol ");           addch(ACS_PLMINUS);     printw("\n");
    printw("Bullet ");                      addch(ACS_BULLET);      printw("\n");
    printw("Arrow Pointing Left ");         addch(ACS_LARROW);      printw("\n");
    printw("Arrow Pointing Right ");        addch(ACS_RARROW);      printw("\n");
    printw("Arrow Pointing Down ");         addch(ACS_DARROW);      printw("\n");
    printw("Arrow Pointing Up ");           addch(ACS_UARROW);      printw("\n");
    printw("Board of squares ");            addch(ACS_BOARD);       printw("\n");
    printw("LanternSymbol ");               addch(ACS_LANTERN);     printw("\n");
    printw("Solid Square Block ");          addch(ACS_BLOCK);       printw("\n");
    printw("Less/Equal sign ");             addch(ACS_LEQUAL);      printw("\n");
    printw("Greater/Equalsign ");           addch(ACS_GEQUAL);      printw("\n");
    printw("Pi ");                          addch(ACS_PI);          printw("\n");
    printw("Not equal ");                   addch(ACS_NEQUAL);      printw("\n");
    printw("UK pound sign ");               addch(ACS_STERLING);    printw("\n");
    refresh();
    getch();
    endwin();
    return 0;
}

擴充套件庫

curses 函式除了主函式庫外,還有一些具有很多新功能和特性的字元文字模式的擴充套件庫。以下章節將分別介紹與curses 一起釋出的三個擴充套件庫(panel(皮膚擴充套件庫)、menu(選單擴充套件庫)、form(表單擴充套件庫))。

相關文章