○テキストボックスを作る
▼テキストボックスをマウスでクリックするとキーボードから文字が入力できます
#include<X11/Xlib.h>
#include<X11/Xutil.h>
void print(Display *d,Window w,GC gc,char*str){
XClearWindow(d,w);//ウィンドウのクリア
int width=2;
int height=10;
XDrawString( d, w, gc, width, height, str, strlen(str));
XFlush( d );
}
void addStr(char*buf,char*str){
if(str[0]==8){//BS文字の判定
if(strlen(buf)) buf[strlen(buf)-1]='\0';//文字列の長さが0以上なら一文字削除
}else{
//文字列の連結
char strpos[128];
strcpy(strpos,buf);
sprintf(buf,"%s%s",strpos,str);
}
}
main(){
Display *d;
Window w;
int screen;
XSetWindowAttributes attr;
GC gc;
d = XOpenDisplay( NULL );//Xサーバーに接続する
screen=DefaultScreen(d);
//ウインドウの作成
w = XCreateSimpleWindow( d, RootWindow(d,screen),
0, 0, 200, 200,//ウインドウのサイズ
1,BlackPixel(d,screen),//枠の設定
WhitePixel(d,screen));//背景色の色番号
//テキストボックス作成----------------------------------------------------------------------
//ウィンドウをウインドウの中に作成してテキストボックスにする
char text1[128]="";//対応する文字のバッファ
Window edit1=XCreateSimpleWindow( d, w,
10, 10, 80, 15,//ウインドウのサイズ
1,BlackPixel(d,screen),//枠の設定
WhitePixel(d,screen));//背景色の色番号
//マップして表示
XMapWindow( d,edit1 );
//イベントマスクを登録
XSelectInput( d, edit1,KeyPressMask | ButtonPressMask);
//----------------------------------------------------------------------
//テキストボックス2を作成----------------------------------------------------------------------
//ウィンドウをウインドウの中に作成してテキストボックスにする
char text2[128]="";//対応する文字のバッファ
Window edit2=XCreateSimpleWindow( d, w,
10, 50, 80, 15,//ウインドウのサイズ
1,BlackPixel(d,screen),//枠の設定
WhitePixel(d,screen));//背景色の色番号
//マップして表示
XMapWindow( d,edit2 );
//イベントマスクを登録
XSelectInput( d, edit2,KeyPressMask | ButtonPressMask);
//----------------------------------------------------------------------
//ウィンドウの内容を記憶
attr.backing_store = WhenMapped;
XChangeWindowAttributes( d, w, CWBackingStore, &attr);
//ウインドウ名の設定
XStoreName(d, w, "test Window");
XSetIconName(d, w, "test Window");
//グラフィックコンテキストを取得
gc = XCreateGC( d, RootWindow( d,screen ), 0, 0);
XEvent event;
//イベントマスクを登録
XSelectInput( d, w,ExposureMask | KeyPressMask | ButtonPressMask);
//マップして表示
XMapWindow( d, w );
XFlush( d );
KeySym key;
char strbuf[10];
//クリックされたWindowを保存しておく変数
//キーボード入力時、このWindowに対応したバッファに文字が追加される
Window wpos;
while(1){
XNextEvent( d, &event );
switch(event.type){
case Expose:
//全てのテキストボックスの再描画
print(d,edit1,gc,text1);
print(d,edit2,gc,text2);
break;
case ButtonPress://画面上でマウスのボタンが押された時のWindowを確保
wpos=event.xexpose.window;
break;
case KeyPress:
XLookupString((XKeyEvent *)&event, strbuf, sizeof(strbuf), &key, NULL);
if(wpos==edit1){//確保されたWindowに対応する文字バッファに文字を追加
addStr(text1,strbuf);
}else if(wpos==edit2){
addStr(text2,strbuf);
}
//全てのテキストボックスの再描画
print(d,edit1,gc,text1);
print(d,edit2,gc,text2);
break;
default:
break;
}
}
}
▲トップページ
>
Linux と C