Previous: イベント処理の基本
Up: Xウィンドウ実習
第6回 マウスからイベントを受け取る
Next: マウス操作によるウィンドウの移動
Previous Page: イベント処理の基本
Next Page: マウス操作によるウィンドウの移動
前のプログラムを改良して、図形のコピーのしかたを変えてみます。
今度はマウスのポインタの位置が図形の中心になるように座標を与えます。
また図形が重なった時に、下の図形が消えないように
GCの function を GXor に設定します。
ソース・ファイル名は event2.c としてください。
event2.c
#include<stdio.h> #include<X11/Xlib.h> #include "ueda" /* ビットマップデータ */ main() { Display *dsp; /* ディスプレイ構造体の宣言 */ Window win; /* ウィンドウ構造体の宣言 */ Pixmap pix; /* ピクスマップ構造体の宣言 */ GC gc; /* GC構造体の宣言 */ XEvent eve; /* イベント構造体の宣言 */ Colormap cmap; /* カラーマップの宣言 */ XColor aka, dummy; /* カラー構造体の宣言 */ static char *win_name = "印鑑ツール";dsp = XOpenDisplay( NULL ); /* ディスプレイのオープン */
cmap = DefaultColormap( dsp, 0 ); /* カラーマップを得る */ /* カラーマップから色を得る */ XAllocNamedColor( dsp, cmap, "red", &aka, &dummy );
/* ウィンドウの生成 */ win = XCreateSimpleWindow( dsp, DefaultRootWindow(dsp), 0, 0, 800, 600, 1, BlackPixel(dsp,0), WhitePixel(dsp,0) ); /* ピクスマップの生成 */ pix = XCreatePixmapFromBitmapData( dsp, win, ueda_bits, ueda_width, ueda_height, aka.pixel, 0x00, 8 );
gc = XCreateGC( dsp, win, NULL, NULL ); /* GCの生成 */ XSetFunction( dsp, gc, GXor ); /* GCに関数を設定 */
XStoreName( dsp, win, win_name ); /* タイトルの設定 */
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: /* 図形をコピー(図形の中心をマウスのポインタの位置にする) */ XCopyArea( dsp, pix, win, gc, 0, 0, ueda_width, ueda_height, eve.xbutton.x-ueda_width/2, eve.xbutton.y-ueda_height/2 ); break; case 2: XClearWindow( dsp, win ); break; case 3: XCloseDisplay( dsp ); /* ディスプレイのクローズ */ exit(0); /* 終了 */ default: break; } default: break; } } }
うまくいった人は次の課題に挑んでみてください。