○タイマーでラベルの文字を更新する

■ボタンやラベルの文字の変更と再描画

//ボタンやラベルの文字を変更する
void setCaption(Widget w,char*str){
	Arg args[1];
	XtSetArg(args[0],XtNlabel,(XtArgVal)str);
	XtSetValues(w,args,1);
	XClearArea(XtDisplay(w), XtWindow(w), 0, 0, 0, 0, True);//再描画
}

■タイマー

▼タイマースタートは次の関数を呼び出してスタートする

//経過時間後に関数を呼び出す設定(ミリ秒)
XtAppAddTimeOut(app_context, 500, (XtTimerCallbackProc)timer,app_context); 

▼タイマーとして呼び出されるメソッド

//タイマーとして動作
void timer(XtAppContext app_context) 
{
	//ここにタイマーの処理内容を書く

	//経過時間後に関数を呼び出す設定(ミリ秒)
	XtAppAddTimeOut(app_context, 500, (XtTimerCallbackProc)timer,app_context); 
}


■500msごとにカウントアップした数字をラベル、テキスト、ボタンに表示する





#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Label.h>
#include <X11/Xaw/Command.h>
#include <X11/Xaw/AsciiText.h>



Widget label1,edit1,button1;//ウィジットの変数


//ボタンやラベルの文字を変更する
void setCaption(Widget w,char*str){
	Arg args[1];
	XtSetArg(args[0],XtNlabel,(XtArgVal)str);
	XtSetValues(w,args,1);
	XClearArea(XtDisplay(w), XtWindow(w), 0, 0, 0, 0, True);//再描画
}

//Textウィジットから文字列を取得
void getStr(Widget w,char*str){
	char*st;
	Arg args[1];
	XtSetArg(args[0],XtNstring,(XtArgVal)&st);
	XtGetValues(w,args,1);
	strcpy(str,st);
}

//Textウィジットに文字を入れる
void setStr(Widget w,char*str){
	Arg args[1];
	XtSetArg(args[0],XtNstring,(XtArgVal)str);
	XtSetValues(w,args,1);
}

int i=0;//カウントアップする文字列を作るための変数

//タイマーとして動作
void timer(XtAppContext app_context) 
{
	char buf[128];
	sprintf(buf,"%d",i++);//カウントアップする文字列を作る

	setCaption(label1,buf);//ラベルに文字を入れる
	setStr(edit1,buf);//テキストに文字を入れる
	setCaption(button1,buf);//ボタンに文字を入れる

	//経過時間後に関数を呼び出しを設定
	XtAppAddTimeOut(app_context, 500, (XtTimerCallbackProc)timer,app_context); 
}

//ボタンが押された時の動作
void Button1Callback( Widget w, XtPointer client, XtPointer called )
{
	exit(0);
}

//テキストが入力された時の動作、入力されているテキストを表示
void Edit1Callback( Widget w, XtPointer cld, XtPointer cad ){
	char str[128]="";
	getStr(w,str);
	printf("%s\n",str);
}

main( int argc, char **argv )
{
	XtAppContext app_context;
	Widget top, form;

	top = XtVaAppInitialize( &app_context, "test", NULL, 0, &argc, argv, NULL,
	//XtNwidth,500,
	//XtNheight,500,
	NULL);


	form = XtVaCreateManagedWidget("form",formWidgetClass,top,NULL);

	//ラベルの作成
	label1 = XtVaCreateManagedWidget("label1",//ウィジット名
					labelWidgetClass,//ラベルクラスを指定
					form,
					//リソースの直接入力(どんどん追加できる)
					XtNlabel,"Label1 test",//表示される文字
					XtNhorizDistance,5,//開始位置
					XtNvertDistance,5,
					XtNwidth,100,//幅と高さ
					XtNheight,20,
					XtNborderWidth,1,//境界線
					//リソースここまで
					NULL);

	//テキストの作成
	edit1 = XtVaCreateManagedWidget("edit1",//ウィジット名
					asciiTextWidgetClass,//クラスを指定
					form,
					//リソースの直接入力(どんどん追加できる)

					XtNeditType,XawtextEdit,//読み書き可能
					//XtNeditType,XawtextRead,//リードオンリー
					//XtNeditType,XawtextAppend,//追加のみ
					XtNecho,True,//入力文字を表示

					//XtNstring,"test",//初期値
					//XtNdisplayCaret,False,//カレットを表示しない
					//XtNscrollHorizontal,XawtextScrollAlways,//横方向のスクロールバーを表示
					//XtNscrollVertical,XawtextScrollAlways,//縦方向のスクロールバーを表示
					//XtNwrap,XawtextWrapWord,//自動折り返し もしくは XawtextWrapLine 

					XtNhorizDistance,25,//開始位置
					XtNvertDistance,30,
					XtNwidth,100,//幅と高さ
					//XtNheight,200,
					XtNborderWidth,1,//境界線
					//リソースここまで
					NULL);

	//テキストボックスにテキストを入れる
	setStr(edit1,"testTEXT");

	//カレットを文字列の最後尾に移動
	XawTextSetInsertionPoint(edit1,strlen("testTEXT"));
	
	//XawTextSetSelection(edit1,1,strlen("testTest"));//テキストを選択

	XtAddCallback( XawTextGetSource(edit1), XtNcallback,Edit1Callback, NULL );//テキストのコールバック関数を登録

	//ボタンの作成
	button1 = XtVaCreateManagedWidget("button1",//ウィジット名
					commandWidgetClass,//ボタンクラスを指定
					form,
					//リソースの直接入力(どんどん追加できる)
					XtNlabel,"Button1 test",//表示される文字
					XtNhorizDistance, 50,//開始位置
					XtNvertDistance,55,
					XtNwidth,100,//幅と高さ
					XtNheight,20,
					XtNborderWidth,1,//境界線
					//リソースここまで
					NULL);

	XtAddCallback(button1, XtNcallback,Button1Callback, NULL );//ボタンのコールバック関数を登録

	//経過時間後に関数を呼び出し、タイマーをスタートする
	XtAppAddTimeOut(app_context, 500, (XtTimerCallbackProc)timer,app_context); 

	XtRealizeWidget( top );
	XtAppMainLoop( app_context );
}






▲トップページ > Linux と C