ncurses輸出修飾:attron(),attroff(),attrset(),attr_get(),attr_,wattr_,chgat(),mvchgat()
- Copyright(C)
NCURSES Programming HOWTO
輸出修飾
我們已經通過一些例子看到了文字修飾(Attributes)的效果。給某些文字加上修飾會使文字更加醒目和美觀。在某些程度上也會增加輸出資訊的可讀性。下面這個程式將會把一個C語言的源程式檔案的註釋部分用粗體(BOLD)
輸出。
例:一個簡單的文字修飾的例子:
/*
Compile: gcc main.c -lncurses
*/
#include <ncurses.h> /* ncurses.h 已經包含了stdio.h */
#include <stdlib.h>
#include <string.h>
//只能讀取一個單行的類似包含以下內容的檔案:
//adsfadf/*aaaaaaaaa*/ adsfadf
//那麼中間的aaaaa就會被加粗顯示
int main(int argc, char *argv[])
{
int ch, prev;
FILE *fp;
int goto_prev = FALSE, y, x;
if(argc != 2)
{
printf("Usage: %s <a c file name>\n", argv[0]);
exit(1);
}
fp = fopen(argv[1],"r"); /* 在這裡檢測檔案是否成功開啟*/
if(fp == NULL)
{
perror("Cannotopen input file");
exit(1);
}
initscr(); /* 初始化並進入curses 模式*/
prev = EOF;
while((ch = fgetc(fp)) != EOF)
{
if(prev == '/' && ch == '*') /* 當讀到字元“/”和“*”的時候開啟修飾*/
{
attron(A_BOLD); /* 將“/”和“*”及以後輸出的文字字型加粗*/
goto_prev = TRUE;
}
if(goto_prev == TRUE) /* 回到“/”和“*”之前開始輸出*/
{
getyx(stdscr, y, x);
move(y, x-1);
printw("%c%c", '/', ch); /* 列印實際內容的部分*/
ch = 'a'; /* 避免下次讀取變數錯誤,這裡賦一個任意值*/
goto_prev = FALSE; /* 讓這段程式只執行一次*/
}
else
printw("%c", ch);
refresh(); /* 將緩衝區的內容重新整理到螢幕上*/
if(prev == '*' && ch == '/')
attroff(A_BOLD); /* 當讀到字元“*”和“/”的時候關閉修飾*/
prev = ch;
}
getch();
endwin(); /* 結束並退出curses 模式*/
return 0;
}
我們把注意集中在上面這段程式碼的while 迴圈體中。這個迴圈體讀取檔案中的每個字元並尋找有“/*”
(註釋起始處標誌)的地方。一旦找到,就會呼叫attron()函式開始啟動文字加粗的修飾。當找到“*/”
(註釋結束處標誌)的地方,就會呼叫attroff()函式停止為後續文字繼續新增修飾。 這個程式介紹了兩個十分有用的函式: getyx()
和move()
。getyx()函式其實是一個定義在ncurses.h 中的巨集,它會給出當前游標的位置,需要注意的是我們不能用指標作為引數,只能傳遞一對整型變數(前文提到過)。函式move()將游標移動到指定位置。(譯者注:在這裡再次強調——所有這些函式中使用行列座標的時候是先行後列,即先寫y 座標,再寫x座標。)很多初學者因為數學上的使用習慣而使用了先列後行的方式。(在這裡一定要注意!
) 這個程式執行的任務非常簡單,無需作過多的說明。這個程式對於分析C 語言原始碼十分有幫助。你也可以試著將輸出文字的顏色改變為其它顏色。也可以將這個程式擴充套件為分析其它語言程式的工具。
詳細介紹
讓我們來更多的瞭解一下輸出修飾。attron()
函式、attroff()
函式和attrset()
函式以及他們的姊妹函式(sister functions)比如attr_get()
等等。可以用這些函式創造出生動有趣的顯示效果。 attron()
函式和attroff()
函式分別用來開啟(on)或關閉(off)輸出修飾。以下這些修飾屬性已經定義在標頭檔案curses.h
中,可以在函式中使用:
A_NORMAL 普通字元輸出(不加亮顯示)
A_STANDOUT 終端字元最亮
A_UNDERLINE 下劃線
A_REVERSE 字元反白顯示
A_BLINK 閃動顯示
A_DIM 半亮顯示
A_BOLD 加亮加粗
A_PROTECT 保護模式
A_INVIS 空白顯示模式
A_ALTCHARSET 字元交替
A_CHARTEXT 字元掩蓋
COLOR_PAIR(n) 前景、背景色設定
最後一個修飾是最吸引人的,它可以設定輸出的字元的顏色以及背景的顏色。 我們可以給一段輸出同時設定多種修飾。這樣可以得到多種結合的效果。如果你想反白顯示字元並同時讓字元閃爍。只需要在兩種修飾屬性間加一個“|”字元就可以了:
attron(A_REVERSE | A_BLINK);
attron()
函式和attrset()
函式之比較
現在我們該討論討論attron()
函式和attrset()
函式之間的區別了。attrset()為整個視窗設定一種修飾屬性。而attron()函式只從被呼叫的地方開始設定。所以attrset()會覆蓋掉你先前為整個視窗設定的所有修飾屬性
。就像在視窗的開始處開啟修飾,在視窗結尾處關閉修飾屬性一樣。這兩種方法為我們管理輸出修飾屬性提供了更簡單、更富有彈性的方法。但是,如果你粗心的話,可能會讓整個螢幕變得十分雜亂無章,使得函式之間的呼叫會難以管理。這種情況,尤其在某些用到選單系統的程式中十分普遍。所以,事先做好設計,然後按照設計去實施效果會好得多。另外,你可以經常使用standend()
函式關閉所有設定的修飾。這個函式和attrset(A_NORMAL)
函式的作用是相同的。
attr_get()
函式
attr_get()
函式用來取得當前視窗的修飾屬性設定以及背景、文字顏色。雖然這個函式不像上面的那些函式常用。但它卻對檢測螢幕區域的修飾屬性設定很有用。當我們在螢幕輸出一些混合的複雜修飾效果時,這個函式可以告訴我們每一個字元關聯的修飾。注意:這個函式必須在呼叫了attrset()
或者attron()
之後才能使用。
attr_
類函式
這些函式都有attr_字首,比如:attr_set()、attr_on()等等,它們的作用和上面的函式一樣,只不過要在呼叫時新增一定的引數。
wattr_
類函式
這些函式的作用範圍是某一個指定的視窗。而上面的函式只作用在預設的stdscr 上。
chgat()
函式
chgat()
函式被列在curs_attr
的man_page
的最末尾。事實上它是一個很有用的函式。它可以在不移動游標位置的情況下修改已輸出的字元的修飾效果。它從游標當前位置處開始,以一個整型引數作為修改字元的個數。給這些字元設定某一種修飾屬性。 當我們給整型引數賦值為1時,它代表一行修飾。如果你想從當前游標位置使整個一行的輸出修飾變為反白顯示時,可以這樣使用:
chgat(1, A_REVERSE, 0, NULL);
這個函式經常被用來修改已輸出的字元的修飾。當然,你也可以根據自己的需要選擇要修改的起始點和終止點。
這一類的函式還包括wchgat()
, mvchgat()
。它們的使用方法和chgat()
差不多,只不過wchgat()
要指定一個視窗,而mvchgat()將游標先移動到指定位置,然後才執行剩下的修飾部分。同樣的,chgat()是一個巨集,只不過用stdscr 替代了指定的視窗(大部分不帶w 字首的函式都是以stdscr 作為預設視窗的巨集)。
例:mvchgat()
用法示例:
/*
Compile: gcc main.c -lncurses
*/
#include <ncurses.h>
int main(int argc, char *argv[])
{
initscr(); /* 進入curses 模式*/
start_color(); /* 開啟顏色管理功能*/
init_pair(1, COLOR_CYAN, COLOR_BLACK);
printw("A Big string which i didn't care to type fully ");
mvchgat(0, 0, 1, A_BLINK, 1, NULL);
mvchgat(0, 5, 10, A_BLINK, 1, NULL);
mvchgat(0, 35, 10, A_BLINK, 1, NULL);
/*
*第一、二個參數列明了函式開始的位置。
*第三個引數是被改變修飾的字元的數目,1
表示一整行。
*第四個引數是被改變的修飾名。
*第五個引數是顏色索引。顏色索引已經在init_pair()中被初試化了。
*如果用0表示不使用顏色。
*最後一個總是NULL,沒什麼特殊含義。
*/
refresh();
getch();
endwin(); /* 結束curses 模式*/
return 0;
}
相關文章
- ncurses輸出函式:字元+字串的輸出函式字元字串
- ncurses輸入函式:字元+字串的輸入函式字元字串
- Vue - 按鍵修飾符 && 系統修飾符Vue
- Java 修飾符Java 修飾符
- java修飾符Java
- final修飾和static final修飾的區別
- 修飾者模式(裝飾者模式,Decoration)模式
- vue 事件修飾符Vue事件
- vue sync 修飾符Vue
- 繼承&修飾符繼承
- iOS __block修飾符iOSBloC
- Java 常用修飾符Java
- 訪問修飾符
- java中的修飾符Java
- Java的static修飾符Java
- html文字修飾標籤HTML
- 許可權修飾符
- Vue事件修飾符詳解Vue事件
- TypeScript 類訪問修飾符TypeScript
- [譯] ECMAScript 修飾器微指南
- Java的訪問修飾符Java
- java修飾符使用指南Java
- 關於Java中各種修飾符與訪問修飾符的說明 (轉)Java
- ncurses庫移植
- 編譯 ncurses編譯
- v-on 及其事件修飾符事件
- 從實踐認識修飾符
- Sanic 處理函式修飾器函式
- decorator(修飾器)的業務應用
- python函式修飾器(decorator)Python函式
- Kotlin可見性修飾符Kotlin
- java oop 修飾符&關鍵字JavaOOP
- 正規表示式模式修飾符模式
- MongoDB ( 四 )高階_find修飾符MongoDB
- Java 修飾符順序問題Java 修飾符
- Vue的.sync修飾符的使用Vue
- const修飾虛擬函式函式
- Java修飾符關鍵詞大全Java