○ダイアログ

■ボタンを押すとダイアログがモーダルでポップアップします





#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Command.h>
#include <X11/Xaw/Dialog.h>
#include <X11/Shell.h>

Widget shell1,dialog1;//ダイアログの変数

//ボタンが押された時の動作
void Button1Callback( Widget w, XtPointer client, XtPointer called )
{
	XtPopup( shell1, XtGrabNonexclusive );//ダイアログをモーダルで表示
	//XtGrabNone XtGrabNonexclusive XtGrabExclusive
}

//ダイアログのボタンが押された時の動作
void dialogOkButton( Widget w, XtPointer client, XtPointer called )
{
	XtPopdown(shell1);//ダイアログを非表示にする
}

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

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


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

	//ボタンの作成
	Widget button1 = XtVaCreateManagedWidget("button1",//ウィジット名
					commandWidgetClass,//ボタンクラスを指定
					form,
					//リソースの直接入力(どんどん追加できる)
					XtNlabel,"Show Dialog",//表示される文字
					XtNhorizDistance, 5,//開始位置
					XtNvertDistance,5,
					XtNwidth,100,//幅と高さ
					XtNheight,20,
					XtNborderWidth,1,//境界線
					//リソースここまで
					NULL);
	XtAddCallback(button1, XtNcallback,Button1Callback,NULL );//ボタンのコールバック関数を登録



	//ダイアログを作成---------------------------------------------------
	shell1 = XtVaCreatePopupShell( "Message", transientShellWidgetClass, top,XtNx,200,XtNy,200,NULL );
	dialog1 = XtVaCreateManagedWidget( "dialog1", dialogWidgetClass, shell1,XtNlabel,"test dialog", NULL );

	XawDialogAddButton( dialog1, "yes", dialogOkButton, NULL );//ダイアログのボタンの作成とコールバック関数を登録
	XawDialogAddButton( dialog1, "no", dialogOkButton, NULL );
	XawDialogAddButton( dialog1, "cancel", dialogOkButton, NULL );
	//------------------------------------------------------------------


	XtRealizeWidget( top );
	XtAppMainLoop( app_context );
}




■ダイアログの閉じるボタンを押すと、ダイアログが閉じる
ダイアログウィンドウのプロパティの変更して閉じるボタンが押された時のコールバック関数の登録しています



#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Command.h>
#include <X11/Xaw/Dialog.h>
#include <X11/Shell.h>

Widget shell1,dialog1;//ダイアログの変数
Atom DialogAtom1,DialogAtom2;

//ダイアログウィンドウの閉じるボタンが押された時の処理
void DialogCloseButton( Widget w, caddr_t client_data, XEvent *event ){
	//閉じるイベントかどうか識別
	if(event->type==ClientMessage){
		//閉じるボタンを押されたイベントを識別
		if ( event->xclient.message_type == DialogAtom1 && event->xclient.data.l[0] == DialogAtom2 ){
			printf("dialog close button click\n");
			XtPopdown(shell1);//ダイアログを非表示にする
			//XCloseDisplay(d);
			//exit(0);
		}
	}
}

//ダイアログのボタンが押された時の動作
void dialogOkButton( Widget w, XtPointer client, XtPointer called )
{
	XtPopdown(shell1);//ダイアログを非表示にする
}

//ボタンが押された時の動作
void Button1Callback( Widget w, XtPointer client, XtPointer called )
{
	XtPopup( shell1, XtGrabNonexclusive );//ダイアログをモーダルで表示
	//XtGrabNone XtGrabNonexclusive XtGrabExclusive
	
	//ダイアログウィンドウのプロパティの変更
	DialogAtom1 = XInternAtom(XtDisplay(shell1), "WM_PROTOCOLS", False);
	DialogAtom2 = XInternAtom(XtDisplay(shell1), "WM_DELETE_WINDOW", False);
	XSetWMProtocols(XtDisplay(shell1),XtWindow(shell1), &DialogAtom2,1);
}

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

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




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

	//ボタンの作成
	Widget button1 = XtVaCreateManagedWidget("button1",//ウィジット名
					commandWidgetClass,//ボタンクラスを指定
					form,
					//リソースの直接入力(どんどん追加できる)
					XtNlabel,"Show Dialog",//表示される文字
					XtNhorizDistance, 5,//開始位置
					XtNvertDistance,5,
					XtNwidth,100,//幅と高さ
					XtNheight,20,
					XtNborderWidth,1,//境界線
					//リソースここまで
					NULL);
	XtAddCallback(button1, XtNcallback,Button1Callback,NULL );//ボタンのコールバック関数を登録



	//ダイアログを作成---------------------------------------------------
	shell1 = XtVaCreatePopupShell( "Message", transientShellWidgetClass, top,XtNx,200,XtNy,200,NULL );
	dialog1 = XtVaCreateManagedWidget( "dialog1", dialogWidgetClass, shell1,XtNlabel,"test dialog", NULL );

	XawDialogAddButton( dialog1, "yes", dialogOkButton, NULL );//ダイアログのボタンの作成とコールバック関数を登録
	XawDialogAddButton( dialog1, "no", dialogOkButton, NULL );
	XawDialogAddButton( dialog1, "cancel", dialogOkButton, NULL );

	//閉じるボタンが押された時のコールバック関数の登録
	XtAddEventHandler(shell1,NoEventMask,True,(XtEventHandler)DialogCloseButton,NULL);//イベントのコールバック関数の登録
	//------------------------------------------------------------------


	XtRealizeWidget( top );
	XtAppMainLoop( app_context );
}









▲トップページ > Linux と C