○メニュー
■メニューを表示する
メニューボタンと、メニューシェルは、名前で関連付けられています
メニューを作成すれば、イベントを書かなくてもメニューボタンを押すとメニューが表示されます。
メニューボタンを押すと
#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