|
藍森林 http://www.lslnet.com 2006年6月6日 10:18
在curses中應用顏色
簡介:在有顏色機制的終端中,可以利用curses庫中提供的幾個關於顏色的例程編寫有彩色的用戶界面,而不必每天對著黑底白字。
一、包含curses庫及編譯時連接curses庫
在源程序中應含有下列語句:
# include <curses.h>;
在編譯時,命令行中至少應有下列連接:
# cc -ofile file.c -lcurses
這樣在編譯時就不會提示找不到定義或說明了。
二、下面就介紹幾個curses庫中關於彩色機制的庫例程
操縱彩色字符終端顏色的例程是curses新增加的內容。應用它們應該首先調用start_color(),通常在initscr()後面就調用它。顏色一般都是成對的,一個顏色有前景色(字符)和背景色構成,一個程序用init_pair()來初始化顏色對,顏色對初始化後,一個在<curses.h>;中定義的宏COLOR_PAIR(n)就能用來使用顏色屬性,就如同A_UNDERLINE、A_BLINK、A_REVERSE等字符顯示屬性一樣。
如果一個終端能夠改變顏色,程序就可以用init_color()來改變顏色的定義。當終端能提供顏色機制時,例程has_color()就返回TRUE,否則返回FALSE;當終端能改變顏色時,can_change_color()返回TRUE,不能改變顏色時返回FALSE;例程color_content()允許程序在初始化顏色時指定顏色成分中紅、綠、藍的值;而例程pair_content()允許一個程序找出一個當前定義中給定的顏色對。
定義在curses.h中的整型全局變量COLORS和COLOR_PAIRS分別包含終端能提供的顏色和顏色對的最大值。注意:它們是整型變量,不是宏定義,它們由start_color()初始化。在vga中,一般COLOR_PAIRS為64,COLORS為8。
三、init_pair()例程的詳細說明
此例程的原型為
init_pair(pair, f, b)
pair為顏色對號,範圍為1~COLOR_PAIRS-1,在vga中就為1~63;
f, b前景色、背景色的顏色號,範圍1~COLORS-1,在vga中為1~7。
初始化成功後返回OK。
注意:1、如果顏色對被初始化,那麼屏幕立即刷新。
2、顏色和顏色對之間的不同。
四、顏色處理的一般流程
1、初始化curses:
利用initscr()和refresh()例程來完成。
2、判斷終端是否支持顏色機制:
利用has_colors()來判斷。如果它返回TRUE,那就向下進行。
3、初始化顏色機制:
調用start_color(),它不帶參數。
4、初始化顏色對:
調用init_pair(pair, f, b)。pair使用程序員自編的數,只要在1~COLOR_PAIRS之間就行,下一不用在COLOR_PAIR(pair)中;f, b這些前景色和背景色利用下面在<curses.h>;中定義的顏色:
COLOR_BLACK 0
COLOR_RED 1
COLOR_YELLOW 2
COLOR_GREEN 3
COLOR_BLUE 4
COLOR_MAGENTA 5
COLOR_CYAN 6
COLOR_WHITE 7
5、設置顯示屬性:
利用attrset(COLOR_PAIR(pair))。可以用init_pair()多產生幾個顏色對。再在這裡應用。
6、其他應用
7、關閉顯示屬性
利用attroff(COLOR_PAIR(pair))。
8、可重複5~7這幾個步驟。
9、結束curses
調用endwin()。
五、簡單的例子:
見文件「colortest.c」
/* colortest.c
CJH BOC 2003.03.06
*/
# include <stdio.h>;
# include <ncurses.h>;
initial()
{
initscr();
cbreak();
noecho();
nonl();
keypad(stdscr, TRUE);
refresh();
}
int colorattr(color_id)
int color_id;
{
int attr;
if(! has_colors()) {
attr = A_UNDERLINE;
}
else {
start_color();
init_pair(1, COLOR_BLUE, COLOR_BLACK);
init_pair(2, COLOR_YELLOW, COLOR_BLACK);
init_pair(3, COLOR_RED, COLOR_BLACK);
init_pair(4, COLOR_GREEN, COLOR_BLACK);
init_pair(5, COLOR_MAGENTA, COLOR_BLACK);
init_pair(6, COLOR_CYAN, COLOR_BLACK);
init_pair(7, COLOR_WHITE, COLOR_BLACK);
switch(color_id) {
case 1:
attr = COLOR_PAIR(1);
break;
case 2:
attr = COLOR_PAIR(2);
break;
case 3:
attr = COLOR_PAIR(3);
break;
case 4:
attr = COLOR_PAIR(4);
break;
case 5:
attr = COLOR_PAIR(5);
break;
case 6:
attr = COLOR_PAIR(6);
break;
case 7:
attr = COLOR_PAIR(7);
break;
default :
attr = A_NORMAL;
}
}
return(attr);
}
workend(rc)
int rc;
{
endwin();
return(rc);
}
main(argc, argv)
int argc;
char *argv[];
{
int color_id;
if(argc < 2) {
fprintf(stderr, "Usage : %s color_id\n", argv[0]);
exit(-1);
}
color_id = atoi(argv[1]);
initial();
attrset(colorattr(color_id));
attron(colorattr(color_id));
mvprintw(12, 20, "ABCDEFGHIJKLMN");
mvgetch(24, 0);
workend(0);
}
|
| |