質問: ncursesで... 色を変化させた文字をncursesライブラリを使用し,表示できることはわかったのですが,色を変化させた文字を常に変化させておく方法はないのでしょうか?(文字を表示する関数を呼び出しで実行すると2回目呼び出したときに、最初に呼び出した方の文字の色が変化してしまいます・・・) 実行環境はvinelinuxを使用し,c言語で記述しています.(以下に関数のコード記載します) void makecard(int x,int y,char crd[]){ start_color(); init_pair(color_red,color_red,color_white); init_pair(color_black,color_black,color_white); if(crd[0]=='d' || crd[0]=='h')/*受けた文字列の先頭がdかhなら文字を赤くする*/ attrset(color_pair(color_red)); else attrset(color_pair(color_black)); mvprintw(y+24,x+7,"%s",crd); refresh(); } 改善点などなんでも良いです。未熟な自分にご享受ください!お願いします!
回答: init_pair( )に指定するのは、1から始まる自分定義のペア番号、前景色、背景色ですよ。 で、表示属性はattrset( )で指定するのではなく、attron( )とattroff( )のペアで指定しましょう。 それで以下のようにしてみます。 初期化コードは1回で良いので初期化関数を定義しました。あとカラーペア番号もマクロにしてマジックナンバーにならないようにしています。 全角のスペースでインデントしてあるので試す場合には注意してくださいね。 #include #include #define red_suit 1 #define black_suit 2 void initscreen(void) { initscr(); if (has_colors() == false) { endwin(); exit(exit_failure); } start_color(); init_pair(red_suit, color_red, color_white); init_pair(black_suit, color_black, color_white); } void makecard(int x, int y, char *crd) { short suit; switch (crd[0]) { case 'h': case 'd': suit = red_suit; break; case 's': case 'c': suit = black_suit; break; default: return; break; } attron(color_pair(suit)); mvprintw(y + 24, x + 7, "%s", crd); attroff(color_pair(suit)); refresh(); } int main(int argc, char **argv) { initscreen(); makecard(0, 0, "s 10"); makecard(0, 1, "h j"); makecard(0, 2, "d 9"); makecard(0, 3, "c a"); getch(); endwin(); exit(exit_success); }