藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 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);
}





Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com