Previous: 準備
Up: Xウィンドウ実習
第6回 少し複雑なイベント処理
Next: 複数のウィンドウからのイベント
Previous Page: 準備
Next Page: 複数のウィンドウからのイベント
前回の授業で勉強したイベントを処理の基本を復習します。
event1.c または event2.c を元にすればすぐできるはずです。
ソース・ファイル名は event4.c としてください。
event4.c
#include<stdio.h>
#include<X11/Xlib.h>
#include "yours" /* ビットマップデータ */
#include "dash" /* ビットマップデータ */
main()
{
Display *dsp; /* ディスプレイ構造体の宣言 */
Window win; /* ウィンドウ構造体の宣言 */
Pixmap pix, back_pix; /* ピクスマップ構造体の宣言 */
GC gc; /* GC構造体の宣言 */
XEvent eve; /* イベント構造体の宣言 */
Colormap cmap; /* カラーマップの宣言 */
XColor iro, dummy; /* カラー構造体の宣言 */
static char *win_name = "サービス スタンプ";
dsp = XOpenDisplay( NULL ); /* ディスプレイのオープン */
cmap = DefaultColormap( dsp, 0 ); /* カラーマップを得る */
/* カラーマップから色を得る */
XAllocNamedColor( dsp, cmap, "red2", &iro, &dummy);
/* ウィンドウの生成 */
win = XCreateSimpleWindow( dsp, DefaultRootWindow(dsp),
0, 0, 840, 640, 1,
BlackPixel(dsp,0), WhitePixel(dsp,0) );
/* ピクスマップの生成 */
pix = XCreatePixmapFromBitmapData( dsp, win, yours_bits,
yours_width, yours_height,
iro.pixel, WhitePixel(dsp,0), 8 );
back_pix = XCreatePixmapFromBitmapData( dsp, win, dash_bits,
dash_width, dash_height,
BlackPixel(dsp,0), WhitePixel(dsp,0), 8 );
gc = XCreateGC( dsp, win, NULL, NULL ); /* GCの生成 */
XStoreName( dsp, win, win_name ); /* タイトルの設定 */
XSetWindowBackgroundPixmap( dsp, win, back_pix ); /* 背景の模様を設定 */
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, yours_width, yours_height,
eve.xbutton.x - yours_width/2,
eve.xbutton.y - yours_height/2 );
break;
case 2:
XClearWindow( dsp, win ); /* ウィンドウのクリア */
break;
case 3:
XCloseDisplay( dsp ); /* ディスプレイのクローズ */
exit(0); /* 終了 */
default:
break;
}
default:
break;
}
}
}
プログラムができたら、コンパイルして実行してみましょう。