ncurses關於顏色系統:start_color(),has_colors(),init_pair(),color_content(),pait_content()

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

關於顏色系統

基礎知識

如果生命中沒有顏色將會單調無趣。curses 有一個非常不錯的顏色處理機制。讓我們通過以下程式來了解一下顏色系統: 例:一個簡單的顏色使用例子

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

void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string);

int main(int argc, char *argv[])
{
    initscr();      /*啟動curses 模式*/
    if(has_colors() == FALSE)
    { 
        endwin();
        printf("You terminal does not support color\n");
        exit(1);
    }
    start_color();  /*啟動color 機制*/
    init_pair(1, COLOR_RED, COLOR_BLACK);
    
    attron(COLOR_PAIR(1));
    
    print_in_middle(stdscr,LINES / 2, 0, 0, "Viola !!! In color ...");
    
    attroff(COLOR_PAIR(1));
    
    getch();
    endwin();
}
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string)
{
    int length, x, y;
    float temp;
    
    if(win == NULL)
        win = stdscr;
    
    getyx(win, y, x);
    
    if(startx != 0)
        x = startx;
    if(starty != 0)
        y = starty;
    if(width == 0)
        width = 80;
    
    length = strlen(string);
    temp = (width-length)/2;
    x = startx + (int)temp;
    
    mvwprintw(win, y, x, "%s", string);
    
    refresh();
}

通過這個例子你可以看到,要啟動彩色機制,必須先呼叫start_color()函式,之後就可以在終端螢幕上呼叫其它處理顏色的函式。如果要檢測當前螢幕是否支援彩色顯示,可以呼叫has_colors()函式,如果終端螢幕不支援彩色顯示,那麼該函式將返回FLASE。 在呼叫start_color()函式後,curses 就初始化了當前終端支援的所有顏色。然後就可通過像COLOR_BLACK 這樣的巨集呼叫各種顏色。你現在如果要使用顏色,就必須成對定義前景色和背景色。所有的顏色都是這樣使用的。這意味著你必須用init_pair()函式給每一對顏色編號併為其設定前景色和背景色。之後這個編號就作為呼叫顏色對的引數, 傳遞給COLOR_PAIR()函式,用來呼叫你已定義的顏色對。也許一開始你會覺得這樣做很麻煩,但它會讓你很輕鬆管理顏色對。“dialog”就使用了這種管理顏色的方法。你可以通過原始碼瞭解這個用Shell 指令碼編寫的對話方塊。開發者應該在程式開始的部分定義並且初始化所需要使用的顏色對常量。這樣做會讓我們更容易的設定顏色屬性。 以下的這些顏色已經被預定義在ncurses.h 裡,你可以將它們當作顏色引數傳遞給相應的顏色函式。

COLOR_BLACK     0   黑色
COLOR_RED       1   紅色
COLOR_GREEN     2   綠色
COLOR_YELLOW    3   黃色
COLOR_BLUE      4   藍色
COLOR_MAGENTA   5   洋紅色
COLOR_CYAN      6   藍綠色, 青色
COLOR_WHITE     7   白色

改變顏色定義

init_color()函式可以用來在初始化顏色的時候改變某個顏色的RGB 值。比如你想減弱預定的紅色設定。你就可以這樣呼叫此函式:

init_color(COLOR_RED, 700, 0, 0/* 引數1 : 顏色名稱
/* 引數2, 3, 4 : 分別為R(red),G(green),B(blue)的數值(最小值:0 最大值:1000)*/

如果你的顯示終端無法改變顏色設定,函式將返回ERRcan_change_color()函式可以用來監測你的終端是否支援這樣的顏色改變。RGB 引數的值是0 到1000 的整數。預設的紅色(COLOR_RED)的定義是R:1000,G:0,B:0 。

顏色定義內容

color_content()函式和pair_content()函式可以用來檢視當前顏色的設定。

相關文章