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 ; } }