○モーダル・モードレスでポップアップ表示できるフォーム


■モーダル・モードレスで表示するフォームを作成

	Widget top = XtVaCreatePopupShell( "Message", transientShellWidgetClass,top1,//親フォームのWidgetを指定(top1)
					//XtNx,200,XtNy,200,//サイズを指定
					NULL );

	Widget form =XtVaCreateManagedWidget( "MessageForm",formWidgetClass,MessageTop,
					XtNorientation, XtorientVertical,//ウィジットの配置方法
					NULL );

▼表示と非表示
モーダルは複数のポップアップウィンドウを表示していても、すべてのウィンドウに対して有効です

	XtPopup(top, XtGrabNonexclusive );//モーダルで表示
	XtPopup(top, XtGrabNone );//モードレスで表示

	XtPopdown(MessageTop);//非表示



■ボタンを押すとメッセージボックス状のフォームをモーダルで開きます









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

Widget top1,form1,button1;
Widget MessageTop,MessageForm,MessageLabel,MessageOkButton;

//ボタンが押された時の動作
void Button1Callback( Widget w, XtPointer client, XtPointer called )
{
	XtPopup(MessageTop, XtGrabNonexclusive );//モーダルで表示
	//XtPopup(MessageTop, XtGrabNone );//モードレスで表示
}

void MessageOkButtonCallback( Widget w, XtPointer client, XtPointer called )
{
	XtPopdown(MessageTop);//非表示
}

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

	XtToolkitInitialize();//初期化
	app_context = XtCreateApplicationContext();

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

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

	XtRealizeWidget(top1);//top1の表示
	
	
	//モーダルで表示するフォームを作成-----------------

	MessageTop = XtVaCreatePopupShell( "Message", transientShellWidgetClass,top1,
					//XtNx,200,XtNy,200,//サイズを指定
					NULL );

	MessageForm =XtVaCreateManagedWidget( "MessageForm",formWidgetClass,MessageTop,
					XtNorientation, XtorientVertical,//ウィジットの配置方法
					NULL );
	
	MessageLabel = XtVaCreateManagedWidget("MessageLabel",//ウィジット名
					labelWidgetClass,//ラベルクラスを指定
					MessageForm,
					//リソースの直接入力(どんどん追加できる)
					XtNlabel,"MessageLabel",//表示される文字
					XtNwidth, 200,//横幅
					XtNborderWidth,0,//境界線
					//リソースここまで
					NULL);

	MessageOkButton = XtVaCreateManagedWidget("MessageOkButton",//ウィジット名
					commandWidgetClass,//ボタンクラスを指定
					MessageForm,
					//リソースの直接入力(どんどん追加できる)
					XtNlabel,"OK",//表示される文字
					XtNwidth, 66,//横幅
					XtNhorizDistance,66,//開始位置
					XtNfromVert,MessageLabel,XtNvertDistance, 2,//label1ウィジットの2ピクセル下に配置
					//リソースここまで
					NULL);

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


	XtAppMainLoop(app_context);
}





■ウィンドウの閉じるボタンが押されるとポップダウンする処理を追加




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


Widget top1,form1,button1;
Widget MessageTop,MessageForm,MessageLabel,MessageOkButton;
Atom MessageAtom1,MessageAtom2;

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

//ボタンが押された時の動作
void Button1Callback( Widget w, XtPointer client, XtPointer called )
{
	XtPopup(MessageTop, XtGrabNonexclusive );//モーダルで表示
	//XtPopup(MessageTop, XtGrabNone );//モードレスで表示

	//ウィンドウのプロパティの変更
	MessageAtom1 = XInternAtom(XtDisplay(MessageTop), "WM_PROTOCOLS", False);
	MessageAtom2 = XInternAtom(XtDisplay(MessageTop), "WM_DELETE_WINDOW", False);
	XSetWMProtocols(XtDisplay(MessageTop),XtWindow(MessageTop), &MessageAtom2,1);
}

void MessageOkButtonCallback( Widget w, XtPointer client, XtPointer called )
{
	XtPopdown(MessageTop);//非表示
}

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

	XtToolkitInitialize();//初期化
	app_context = XtCreateApplicationContext();

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

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

	XtRealizeWidget(top1);//top1の表示
	
	
	//モーダルで表示するフォームを作成-----------------

	MessageTop = XtVaCreatePopupShell( "Message", transientShellWidgetClass,top1,
					//XtNx,200,XtNy,200,//サイズを指定
					NULL );

	MessageForm =XtVaCreateManagedWidget( "MessageForm",formWidgetClass,MessageTop,
					XtNorientation, XtorientVertical,//ウィジットの配置方法
					NULL );
	
	MessageLabel = XtVaCreateManagedWidget("MessageLabel",//ウィジット名
					labelWidgetClass,//ラベルクラスを指定
					MessageForm,
					//リソースの直接入力(どんどん追加できる)
					XtNlabel,"MessageLabel",//表示される文字
					XtNwidth, 200,//横幅
					XtNborderWidth,0,//境界線
					//リソースここまで
					NULL);

	MessageOkButton = XtVaCreateManagedWidget("MessageOkButton",//ウィジット名
					commandWidgetClass,//ボタンクラスを指定
					MessageForm,
					//リソースの直接入力(どんどん追加できる)
					XtNlabel,"OK",//表示される文字
					XtNwidth, 66,//横幅
					XtNhorizDistance,66,//開始位置
					XtNfromVert,MessageLabel,XtNvertDistance, 2,//label1ウィジットの2ピクセル下に配置
					//リソースここまで
					NULL);

	XtAddCallback(MessageOkButton, XtNcallback,MessageOkButtonCallback, NULL );//ボタンのコールバック関数を登録
	//閉じるボタンが押された時のコールバック関数の登録
	XtAddEventHandler(MessageTop,NoEventMask,True,(XtEventHandler)MessageCloseButtonCallback,NULL);//イベントのコールバック関数の登録

	//-----------------------------------------------

	XtAppMainLoop(app_context);
}









▲トップページ > Linux と C