○メニュー

■メニューを表示する



メニューボタンと、メニューシェルは、名前で関連付けられています
メニューを作成すれば、イベントを書かなくてもメニューボタンを押すとメニューが表示されます。


メニューボタンを押すと




#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Label.h>
#include <X11/Xaw/MenuButton.h>
#include <X11/Xaw/SimpleMenu.h>
#include <X11/Xaw/SmeBSB.h>
#include <X11/Xaw/SmeLine.h>

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

	top = XtVaAppInitialize( &app_context, "test", NULL, 0, &argc, argv, NULL,NULL);

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

	//メニューボタンの作成 XtNmenuNameで指定した同じ名前のメニューシェルに自動的に関連付けられる
	Widget MenuButton1 = XtVaCreateManagedWidget( "Menu1", menuButtonWidgetClass, form,
					XtNmenuName,"menu1",//ココと同じ名前のメニューが呼び出される
					XtNvertDistance,5,
					XtNheight,10,
					NULL );

	// menu1 メニューシェルの作成
	Widget menu1 = XtVaCreatePopupShell( "menu1",//ココの名前によりメニューボタンと関連付けられる
								simpleMenuWidgetClass,form, NULL );
	//アイテムの追加
	Widget MenuItem1;
	MenuItem1 = XtVaCreateManagedWidget("item1", smeBSBObjectClass,menu1, XtNlabel,"item1", NULL );
	MenuItem1 = XtVaCreateManagedWidget("item2", smeBSBObjectClass,menu1, XtNlabel,"item2", NULL );
	MenuItem1 = XtVaCreateManagedWidget( "", smeLineObjectClass, menu1, NULL );//線を入れる
	MenuItem1 = XtVaCreateManagedWidget("item3", smeBSBObjectClass,menu1, XtNlabel,"item3", NULL );  
	MenuItem1 = XtVaCreateManagedWidget("item4", smeBSBObjectClass,menu1, XtNlabel,"item4", NULL );  

	//ラベルを貼り付ける
	Widget label1 = XtVaCreateManagedWidget("label1",//ウィジット名
					labelWidgetClass,//ラベルクラスを指定
					form,
					//リソースの直接入力(どんどん追加できる)
					XtNfromVert,MenuButton1,XtNvertDistance, 2,//MenuButton1ウィジットの2ピクセル下に配置
					XtNlabel,"",//表示される文字
					XtNwidth,100,//幅と高さ
					XtNheight,100,
					XtNborderWidth,1,//境界線
					//リソースここまで
					NULL);

	XtRealizeWidget( top );
	XtAppMainLoop( app_context );
}




■上のメニューに選択時のイベントを付ける
選択したメニューの名前が出力されます


#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Label.h>
#include <X11/Xaw/MenuButton.h>
#include <X11/Xaw/SimpleMenu.h>
#include <X11/Xaw/SmeBSB.h>
#include <X11/Xaw/SmeLine.h>

//メニューのコールバック関数
void Menu1Callback( Widget w, XtPointer client, XtPointer called )
{
	printf("%s\n",XtName(w));
}

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

	top = XtVaAppInitialize( &app_context, "test", NULL, 0, &argc, argv, NULL,NULL);

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

	//メニューボタンの作成 XtNmenuNameで指定した同じ名前のメニューシェルに自動的に関連付けられる
	Widget MenuButton1 = XtVaCreateManagedWidget( "Menu1", menuButtonWidgetClass, form,
					XtNmenuName,"menu1",//ココと同じ名前のメニューが呼び出される
					XtNvertDistance,5,
					XtNheight,10,
					NULL );

	// menu1 メニューシェルの作成
	Widget menu1 = XtVaCreatePopupShell( "menu1",//ココの名前によりメニューボタンと関連付けられる
								simpleMenuWidgetClass,form, NULL );
	//アイテムの追加
	Widget MenuItem1;
	MenuItem1 = XtVaCreateManagedWidget("item1", smeBSBObjectClass,menu1, XtNlabel,"item1", NULL );
	XtAddCallback(MenuItem1,XtNcallback,Menu1Callback,NULL);//コールバック関数の指定
	
	MenuItem1 = XtVaCreateManagedWidget("item2", smeBSBObjectClass,menu1, XtNlabel,"item2", NULL );
	XtAddCallback(MenuItem1,XtNcallback,Menu1Callback,NULL);//コールバック関数の指定

	MenuItem1 = XtVaCreateManagedWidget( "", smeLineObjectClass, menu1, NULL );//線を入れる

	MenuItem1 = XtVaCreateManagedWidget("item3", smeBSBObjectClass,menu1, XtNlabel,"item3", NULL );
	XtAddCallback(MenuItem1,XtNcallback,Menu1Callback,NULL);//コールバック関数の指定

	MenuItem1 = XtVaCreateManagedWidget("item4", smeBSBObjectClass,menu1, XtNlabel,"item4", NULL );  
	XtAddCallback(MenuItem1,XtNcallback,Menu1Callback,NULL);//コールバック関数の指定

	//ラベルを貼り付ける
	Widget label1 = XtVaCreateManagedWidget("label1",//ウィジット名
					labelWidgetClass,//ラベルクラスを指定
					form,
					//リソースの直接入力(どんどん追加できる)
					XtNfromVert,MenuButton1,XtNvertDistance, 2,//MenuButton1ウィジットの2ピクセル下に配置
					XtNlabel,"",//表示される文字
					XtNwidth,100,//幅と高さ
					XtNheight,100,
					XtNborderWidth,1,//境界線
					//リソースここまで
					NULL);

	XtRealizeWidget( top );
	XtAppMainLoop( app_context );
}



■メニューボタンを複数並べる
ただ単にメニューボタンを並べただけです






#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Label.h>
#include <X11/Xaw/MenuButton.h>
#include <X11/Xaw/SimpleMenu.h>
#include <X11/Xaw/SmeBSB.h>
#include <X11/Xaw/SmeLine.h>


//メニューのコールバック関数
void Menu1Callback( Widget w, XtPointer client, XtPointer called )
{
	printf("%s\n",XtName(w));
}

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

	top = XtVaAppInitialize( &app_context, "test", NULL, 0, &argc, argv, NULL,NULL);

	Widget form = XtVaCreateManagedWidget("form",formWidgetClass,top,NULL);
	
	//----------------------------------------------------------------------------------------
	//メニューボタンの作成 XtNmenuNameで指定した同じ名前のメニューシェルに自動的に関連付けられる
	Widget MenuButton1 = XtVaCreateManagedWidget( "Menu1", menuButtonWidgetClass, form,
					XtNmenuName,"menu1",//ココと同じ名前のメニューが呼び出される
					XtNvertDistance,5,
					XtNheight,10,
					NULL );

	// menu1 メニューシェルの作成
	Widget menu1 = XtVaCreatePopupShell( "menu1",//ココの名前によりメニューボタンと関連付けられる
								simpleMenuWidgetClass,form, NULL );
	//アイテムの追加
	Widget MenuItem1;
	MenuItem1 = XtVaCreateManagedWidget("item1", smeBSBObjectClass,menu1, XtNlabel,"item1", NULL );
	XtAddCallback(MenuItem1,XtNcallback,Menu1Callback,NULL);//コールバック関数の指定
	
	MenuItem1 = XtVaCreateManagedWidget("item2", smeBSBObjectClass,menu1, XtNlabel,"item2", NULL );
	XtAddCallback(MenuItem1,XtNcallback,Menu1Callback,NULL);//コールバック関数の指定

	MenuItem1 = XtVaCreateManagedWidget( "", smeLineObjectClass, menu1, NULL );//線を入れる

	MenuItem1 = XtVaCreateManagedWidget("item3", smeBSBObjectClass,menu1, XtNlabel,"item3", NULL );
	XtAddCallback(MenuItem1,XtNcallback,Menu1Callback,NULL);//コールバック関数の指定

	MenuItem1 = XtVaCreateManagedWidget("item4", smeBSBObjectClass,menu1, XtNlabel,"item4", NULL );  
	XtAddCallback(MenuItem1,XtNcallback,Menu1Callback,NULL);//コールバック関数の指定

	//----------------------------------------------------------------------------------------
	//メニューボタンの作成 XtNmenuNameで指定した同じ名前のメニューシェルに自動的に関連付けられる
	Widget MenuButton2 = XtVaCreateManagedWidget( "Menu2", menuButtonWidgetClass, form,
					XtNmenuName,"menu2",//ココと同じ名前のメニューが呼び出される
					XtNfromHoriz,MenuButton1,XtNvertDistance, 2,//MenuButton1ウィジットの2ピクセル横に配置
					XtNvertDistance,5,
					XtNheight,10,
					NULL );

	// menu2 メニューシェルの作成
	Widget menu2 = XtVaCreatePopupShell( "menu2",//ココの名前によりメニューボタンと関連付けられる
								simpleMenuWidgetClass,form, NULL );
	//アイテムの追加
	Widget MenuItem2;
	MenuItem1 = XtVaCreateManagedWidget("item5", smeBSBObjectClass,menu2, XtNlabel,"item5", NULL );
	XtAddCallback(MenuItem1,XtNcallback,Menu1Callback,NULL);//コールバック関数の指定

	//----------------------------------------------------------------------------------------
	//ラベルを貼り付ける
	Widget label1 = XtVaCreateManagedWidget("label1",//ウィジット名
					labelWidgetClass,//ラベルクラスを指定
					form,
					//リソースの直接入力(どんどん追加できる)
					XtNfromVert,MenuButton1,XtNvertDistance, 2,//MenuButton1ウィジットの2ピクセル下に配置
					XtNlabel,"",//表示される文字
					XtNwidth,100,//幅と高さ
					XtNheight,100,
					XtNborderWidth,1,//境界線
					//リソースここまで
					NULL);

	XtRealizeWidget( top );
	XtAppMainLoop( app_context );
}









▲トップページ > Linux と C