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

Previous Page: 変更可能なカラーを使う
Next Page: Xウィンドウ実習
第12回
少し特殊なイベント処理

フォントの指定法

次の例は変更可能なフォント(文字の種類)の使用法です。 Xウィンドウではフォントの情報はGCに記憶させます。
このプログラムでは2種類のフォントを使っています。 また、文字列を少しずつ移動させながら描くことで スクロールの効果を出したり、 色を少しずつ暗くして文字をフェイドアウトさせたりします。
(プログラムを打ち込む必要はありません。コピーしたプログラムを コンパイルして実行してみてください。)

font.c

#include<stdio.h>
#include<sys/time.h>
#include<X11/Xlib.h>
#define  MAX_COLOR  1  /* 使用する色の数 */

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

main() { Display *dsp; Window win; Colormap cmap; XColor iro[MAX_COLOR]; unsigned long pixel[MAX_COLOR]; /* 色のピクセル値を記憶する配列 */ GC gc; Font font1, font2; /* フォント構造体の宣言 */ XEvent eve; int i, j; static char *message[] = { "Produce", "Wakkanai Hokusei", "The End" };

dsp = XOpenDisplay( NULL );

win = XCreateSimpleWindow( dsp, DefaultRootWindow(dsp), 0, 0, 300, 200, 2, WhitePixel(dsp,0), BlackPixel(dsp,0) );

cmap = DefaultColormap( dsp, 0 );

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

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

gc = XCreateGC( dsp, win, NULL, NULL );

XSetForeground( dsp, gc, iro[0].pixel ); /* GCに前景色を設定 */ XSetBackground( dsp, gc, BlackPixel(dsp,0) ); /* GCに背景色を設定 */

/* フォントのロード */ font1= XLoadFont( dsp, "9x15bold" ); font2= XLoadFont( dsp, "-adobe-times-bold-i-normal--*-240-*-*-p-*-iso8859-1" );

XStoreName( dsp, win, "Fade Out " );

XSelectInput( dsp, win, ButtonPressMask );

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

while( True ) { XNextEvent( dsp, &eve ); switch( eve.type ) { case ButtonPress : switch( eve.xbutton.button ) { case 1: iro[0].red=65535; iro[0].green=65535; iro[0].blue=65535; XStoreColor( dsp, cmap, &iro[0] );

for( i=0 ; i<250 ; i++ ) /* 文字列をスクロール */ { XSetFont( dsp, gc, font1 ); /* フォントの設定 */ XDrawImageString( dsp, win, gc, 120, 150-i, message[0], strlen(message[0]) ); XDrawImageString( dsp, win, gc, 80, 180-i, message[1], strlen(message[1]) ); XSetFont( dsp, gc, font2 ); /* フォントの設定 */ XDrawImageString( dsp, win, gc, 110, 300-i, message[2], strlen(message[2]) ); XFlush( dsp ); timer( 30000 ); } for( i=0 ; i<255 ; i++ ) /* 文字列をファイドアウト */ { iro[0].red-=256; iro[0].green-=256; iro[0].blue-=256; XStoreColor( dsp, cmap, &iro[0] ); XFlush( dsp ); timer( 5000 ); } XClearWindow( dsp, win ); break; case 3: XCloseDisplay( dsp ); exit(0); default: break; } default: break; } } /* whileループの終わり */ } /* main関数の終わり */

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