小试Curses
首先我們應該了解, 在終端使用使用的屏幕模式是基于文本的。
所以在開始使用curses前, 需要用initscr();函數初始化屏幕。
對應的, 程序結束需要調用endwin();函數來關閉curses狀態。
C可以說是Linux的官方語言, 不過你也可以用C++或Python等語言調用curses。
#include <curses.h> int main() { initscr(); box(stdscr, ACS_VLINE, ACS_HLINE);move(LINES / 2, COLS / 2); waddstr(stdscr, "Hello, world!"); refresh(); getch(); endwin(); return 0; }因為curses庫不在標準路徑上, 所以我們要加上 -lcurses連接選項, 像這樣:
gcc -o box box.c -lcurses現在用 ./box 運行一下程序看看,是不是出現了你所期望的窗口。
現在我們來一行行分析一下代碼.
#include <curses.h>這是每個 curses 程序都必須包含的頭文件,表明使用了curses庫
initscr();然后主函數中第一句initscr();初始化了屏幕, 使之開始進入curses圖形化工作方式。
其實我們現在沒有自己建立窗口, 用的是標準屏幕 stdscr(就象C里面標準輸入stdin, 標準輸出stdout一個概念)。
box(stdscr, ACS_VLINE, ACS_HLINE);畫了一個框。
有了這個框我們才有"窗體"的感覺。
stdscr就是標準屏幕, ACS_VLINE和ACS_HLINE代表構成方框兩邊的基本元素,也可以用其它符號代替。.
move(LINES / 2, COLS / 2);waddstr(stdscr, "Hello, world!");這兩句是把光標移到屏幕中間, 然后輸出我們的"Hello, world!"。
LINES 和 COLS是curses定義的宏, 代表當前屏幕的最大行數和列數。
waddstr()函數的作用是在stdscr上打印字符串"hello, world!"。
屏幕分物理屏幕(我們所看到的)和邏輯屏幕(在內存中的)。
我們調用函數時修改的是邏輯屏幕,它不會在當前物理屏幕上顯示出來。
所以現在屏幕上還是什么也沒有, 需要調用refresh()把我們對邏輯屏幕的改動在物理屏幕(顯示器)上顯示出來。
然后用getch()讓屏幕暫停一下。
最后調用endwin()結束curses, 恢復原來的屏幕。
不過不盡如人意的是屏幕還是那個樣子, 沒有什么色彩。
要加色彩也是挺容易的: 首先用start_color()函數開啟顏色模式, 然后設置我們要的顏色就行了。
curses里的顏色是配對的, 要一個背景色對一個前景色。
使用之前用init_pair()初始化。
#include <curses.h> int main(){ initscr(); /*初始化屏幕*/ box(stdscr, ACS_VLINE, ACS_HLINE); if(start_color() == OK) { /*開啟顏色*/ init_pair(1, COLOR_RED, COLOR_GREEN); /*建立一個顏色對*/ attron(COLOR_PAIR(1)); /*開啟字符輸出顏色*/ move(LINES/2, COLS/2); waddstr(stdscr, "Yet another Hello, world!"); attroff(COLOR_PAIR(1)); /*關閉顏色顯示*/ refresh(); } else { waddstr(stdscr, "Can not init color"); refresh(); } getch();endwin(); /*關閉curses狀態*/ return 0; }編譯加鏈接:
gcc -o color color.c -lcurses之后就可以運行:
./color總結
- 上一篇: 阿里云centos7安装和卸载图形化操作
- 下一篇: CentOS curses 中文乱码问题