Previous: 多数の図形を描く
Up: Xウィンドウ実習
第4回 グラフィックスを描く
Previous Page: 多数の図形を描く
Next Page: Xウィンドウ・プログラミング
第5回 ウィンドウのプログラミング・スタイル
さらに応用例を1つ。
今度は非常に細長い長方形を少しずつ色を変えながら描き、
色が連続的に変化しているように見せるプログラムです。
ここでは少しぜいたくですが、空の色に全部で64色使っています。そのために
色の配列 sora[ ] を宣言し、for文を使って少しずつ変化する色のデータを
与えるように工夫がされています。
次のプログラムを完成させてください。
ソース・ファイル名は win13.c とします。
win13.c
#include<stdio.h> #include<X11/Xlib.h> main() { Display *dsp; /* ディスプレイ構造体の宣言 */ Window win; /* ウィンドウ構造体の宣言 */ Colormap cmap; /* カラーマップの宣言 */ XColor yama, hosi, sora[64]; /* カラー構造体の宣言 */ GC gc; /* GC構造体の宣言 */ int x, y, width, height; int m;dsp = XOpenDisplay( NULL ); /* ディスプレイのオープン */
cmap = DefaultColormap( dsp, 0 ); /* カラーマップを得る */
/* カラーマップから色を得る */ yama.red=0; yama.green=20000; yama.blue=0; XAllocColor( dsp, cmap, &yama ); hosi.red=65000; hosi.green=65000; hosi.blue=0; XAllocColor( dsp, cmap, &hosi ); for( m=0 ; m<64 ; m++ ) { sora[m].red=m*1000; sora[m].green=30000-m*(64-m)*15; sora[m].blue=64000-m*1000; XAllocColor( dsp, cmap, &sora[m] ); }
/* ウィンドウの生成 */ win = XCreateSimpleWindow( dsp, DefaultRootWindow(dsp), 0, 0, 600, 400, 1, BlackPixel(dsp,0), WhitePixel(dsp,0) ); /* GCの生成 */ gc = XCreateGC( dsp, win, NULL , NULL );
XStoreName( dsp, win, "夕暮れ" ); /* タイトルの設定 */
XMapWindow( dsp, win ); /* ウィンドウの表示 */ XFlush( dsp ); getchar(); /* リターンキーの入力まで停止する */
/* 図形を描く */ XSetForeground( dsp, gc, yama.pixel ); /* 色の設定 */ x=0; y=320; width=600; height=80; XFillRectangle( dsp, win, gc, x, y, width, height ); /* 長方形 */
for( m=0 ; m<64 ; m++ ) { XSetForeground( dsp, gc, sora[m].pixel ); /* 色の設定 */ x=0; y=m*5; width=600; height=5; XFillRectangle( dsp, win, gc, x, y, width, height ); /* 長方形 */ }
XSetForeground( dsp, gc, hosi.pixel ); /* 色の設定 */ XDrawPoint( dsp, win, gc, 30, 55 ); XDrawPoint( dsp, win, gc, 100, 15 ); XDrawPoint( dsp, win, gc, 200, 10 ); XDrawPoint( dsp, win, gc, 250, 30 ); XDrawPoint( dsp, win, gc, 340, 20 ); XDrawPoint( dsp, win, gc, 450, 40 ); XDrawPoint( dsp, win, gc, 510, 25 ); XDrawPoint( dsp, win, gc, 570, 45 ); XFlush( dsp );
getchar(); /* リターンキーの入力まで停止する */
XCloseDisplay( dsp ); /* ディスプレイのクローズ */ }
プログラムができたら、コンパイルして実行してみましょう。