Previous: 準備
Up: Xウィンドウ実習
第11回
少し高度なグラフィックの操作
変更可能なカラーとフォントの指定

Next: フォントの指定法
Previous Page: 準備
Next Page: フォントの指定法

変更可能なカラーを使う

最初の例は変更可能な色の使用法です。Xウィンドウでは 普通はプログラムの途中で色のデータを変更することはしません。 カラーマップの色は他のアプリケーションも利用している可能性があるからです。 しかし、どうしても色を変えたいという場合もあるでしょう。 その時には「プライベートなカラーセル」と呼ばれる色の確保の方法を用います。 今まで使ってきた方法と手順が異なるので注意してください。
(プログラムを打ち込む必要はありません。コピーしたプログラムを コンパイルして実行してみてください。)

color.c

#include<stdio.h>
#include<sys/time.h>
#include<X11/Xlib.h>
#define  REPEAT     6  /* 繰り返しの回数 */
#define  MAX_COLOR  1  /* 使用する色の数 */

void timer( int ); /* タイマーの関数の宣言 */

main() { Display *dsp; Window win; Colormap cmap; XColor iro[MAX_COLOR]; unsigned long pixel[MAX_COLOR]; /* 色のピクセル値を記憶する配列 */ int i, j;

dsp = XOpenDisplay( NULL );

win = XCreateSimpleWindow( dsp, DefaultRootWindow(dsp), 0, 0, 800, 600, 1, WhitePixel(dsp,0), BlackPixel(dsp,0) );

cmap = DefaultColormap( dsp, 0 );

/* 変更可能な色をカラーマップの中に予約する */ XAllocColorCells( dsp, cmap, True, NULL, NULL, pixel, MAX_COLOR );

/* 色の初期値 */ iro[0].red=1000; iro[0].green=32000; iro[0].blue=64000; iro[0].flags = DoRed | DoGreen | DoBlue; /* 三原色とも変化させる */ iro[0].pixel = pixel[0]; /* 予約したピクセル番号を色のデータに記憶させる */ XStoreColor( dsp, cmap, &iro[0] ); /* カラーマップに色を設定 */

XSetWindowBackground( dsp, win, iro[0].pixel ); /* 色を背景色に使用 */

XStoreName( dsp, win, "Change Color " );

XMapWindow( dsp, win ); XFlush( dsp );

for( j=0 ; j<REPEAT ; j++ ) { for( i=0 ; i<64 ; i++ ) /* 青からオレンジに変化 */ { iro[0].red+=1000; iro[0].green+=(20*i-800); iro[0].blue-=1000; XStoreColor( dsp, cmap, &iro[0] ); XFlush( dsp ); timer( 40000 ); /* タイマーの関数を呼び出す */ } for( i=64 ; i>0 ; i-- ) /* オレンジから青に変化 */ { iro[0].red-=1000; iro[0].green-=(20*i-800); iro[0].blue+=1000; XStoreColor( dsp, cmap, &iro[0] ); XFlush( dsp ); timer( 40000 ); /* タイマーの関数を呼び出す */ } }

XCloseDisplay( dsp ); }

void timer( int interval ) /* タイマーの関数の本体 */ { struct timeval old_time, new_time;

gettimeofday( &old_time, NULL ); while( True ) { gettimeofday( &new_time, NULL ); if( new_time.tv_sec > old_time.tv_sec ) new_time.tv_usec += 1000000; if( new_time.tv_usec - old_time.tv_usec > interval ) return ; } }


maruyama@wakhok.ac.jp
1995年02月01日 (水) 00時21分18秒 JST