DtMenuButton ウィジェットは、メニュー区画の外側にメニュー階層機能を提供するために使用します。
DtMenuButton ウィジェットは、XmCascadeButton ウィジェットのメニュー階層機能を補足するコマンド・ウィジェットです。XmCascadeButton ウィジェットを補うものとして、メニュー・バー、プルダウン、またはポップアップの外側で示すことができます (MenuPane の内部では XmCascadeButton ウィジェットを使用します)。図 7-1 に、DtMenuButton ウィジェットの使用例を示します。
DtMenuButton ウィジェットは、libDtWidget ライブラリにあります。ヘッダ・ファイルは、Dt/MenuButton.h です。
DtMenuButton ウィジェットの使用例が入っているデモが、/usr/dt/examples/dtwidget/controls.c にあります。
DtCreateMenuButton() は、CDE ウィジェットを作成する簡易関数です。
DtMenuButton ウィジェットは、XmLabel クラスのサブクラスです。視覚的には、DtMenuButton ウィジェットは、ラベル文字列とメニュー・グリフ (絵文字) を持ちます。メニュー・グリフは、常にウィジェットの右端に表示され、デフォルトでは下向き矢印です。
DtMenuButton ウィジェットには、暗黙的に作成されたサブメニューが接続されています。サブメニューは、この DtMenuButton ウィジェットを親とするポップアップ・メニューです。暗黙的に作成されたサブメニュー名は、この DtMenuButton ウィジェットの名前の前に submenu_ を付けたものです。サブメニューのウィジェット ID は、この DtMenuButton ウィジェットの DtNsubMenuId リソースに XtGetValues を設定することにより取得できます。暗黙的に作成されたサブメニューは、このウィジェットの利用者によって破壊されることはありません。
サブメニューは、DtMenuButton ウィジェットのどこかで [メニュー・ポスト] ボタン(XmRowColumn の XmNmenuPost リソースを参照) を押すことによって、または Motif の取り消しキー (通常は [Escape] キー) を押すことによってポップアップできます。
DtMenuButtonWidget は、Core、XmPrimitive、および XmLabel クラスから動作とリソースを継承します。
クラス・ポインタは、dtMenuButtonWidgetClass です。
クラス名は、DtMenuButtonWidget です。
DtMenuButtonWidget は、サブクラス化をサポートしません。
DtMenuButtonWidget は、次のリソースを提供します。これらのリソースのクラス、型、デフォルト、およびアクセスを表 7-1 に示します。
DtNcascadingCallback は、接続されたサブメニューが表示される前に呼び出されるコールバックのリストを指定します。
DtNcascadePixmap は、メニュー・グリフとして表示されるピックスマップを指定します。ピックスマップが指定されない場合は、下向き矢印が表示されます。
DtNsubMenuId は、この DtMenuButton ウィジェットと関連付けられるポップアップ・メニュー区画のウィジェット ID を指定します。この DtMenuButton を親としてポップアップ・メニュー区画を作成しなければなりません。リソースの設定時に、このウィジェットによってサブメニューが自動的に破壊されるので、ウィジェットの作成時にこのリソースを指定できません。
詳細は、DtMenuButtonwidget(3X) のマニュアル・ページを参照してください。
アクセス欄のコードは、次の作業が可能かどうかを示します。
作成時にリソースを設定する (C)
XtSetValues を使用して設定する (S)
XtGetValues を使用して検索する(G)
名前 |
クラス |
型 |
デフォルト |
アクセス |
---|---|---|---|---|
DtNcascadingCallback |
DtCCallback |
XtCallbackList |
NULL |
C |
DtNcascadePixmap |
DtCPixmap |
Pixmap |
XmUNSPECIFIED_PIXMAP |
CSG |
DtNsubMenuId |
DtCMenuWidget |
Widget |
NULL |
SG |
コールバックのための構造体を次に示し、表 7-2 で説明します。
typedef struct { int reason; XEvent *event; } XmAnyCallbackStruct;表 7-2 DtMenuButtonWidget コールバックのための構造体
構造体 |
説明 |
---|---|
reason |
コールバックが呼び出された reason を返します。 |
event |
コールバックをトリガした XEvent へのポインタ。コールバックが XEvent によってトリガされなかった場合には NULL になります。 |
次の例は、DtMenuButton ウィジェットの作成方法と使用方法を示しています。このコードは、/usr/dt/examples/dtwidget ディレクトリの controls.c デモの一部です。
/* * Example code for DtMenuButton */ #include Dt/DtMenuButton.h /* MenuButton custom glyph */ #define menu_glyph_width 16 #define menu_glyph_height 16 static unsigned char menu_glyph_bits[] = { 0xe0, 0x03, 0x98, 0x0f, 0x84, 0x1f, 0x82, 0x3f, 0x82, 0x3f, 0x81, 0x7f, 0x81, 0x7f, 0xff, 0x7f, 0xff, 0x40, 0xff, 0x40, 0xfe, 0x20, 0xfe, 0x20, 0xfc, 0x10, 0xf8, 0x0c, 0xe0, 0x03, 0x00, 0x00}; static void CreateMenuButtons(Widget parent) { Widget menuButton, submenu, titleLabel, button; Pixmap cascadePixmap; Pixel fg, bg; Cardinal depth; XmString labelString; Arg args[20]; int i, n; /* Create title label */ labelString = XmStringCreateLocalized("MenuButton Widget"); n = 0; XtSetArg(args[n], XmNlabelString, labelString); n++; titleLabel = XmCreateLabel(parent, "title", args, n); XtManageChild(titleLabel); XmStringFree(labelString); /* * Create a MenuButton. * Add push buttons to the built-in popup menu. */ labelString = XmStringCreateLocalized("Action"); n = 0; XtSetArg(args[n], XmNlabelString, labelString); n++; menuButton = DtCreateMenuButton(parent, "menuButton1", args, n); XtManageChild(menuButton); XmStringFree(labelString); XtVaGetValues(menuButton, DtNsubMenuId, &submenu, NULL); button = XmCreatePushButton(submenu, "Push", NULL, 0); XtManageChild(button); button = XmCreatePushButton(submenu, "Pull", NULL, 0); XtManageChild(button); button = XmCreatePushButton(submenu, "Turn", NULL, 0); XtManageChild(button); /* * Create a MenuButton. * Replace the built-in popup menu with a tear-off menu. * Add a custom pixmap in the colors of the MenuButton. */ labelString = XmStringCreateLocalized("Movement"); n = 0; XtSetArg(args[n], XmNlabelString, labelString); n++; menuButton = DtCreateMenuButton(parent, "menuButton1", args, n); XtManageChild(menuButton); XmStringFree(labelString); /* Create a tear-off menu */ n = 0; XtSetArg(args[0], XmNtearOffModel, XmTEAR_OFF_ENABLED); n++; submenu = XmCreatePopupMenu(menuButton, "submenu", args, n); button = XmCreatePushButton(submenu, "Run", NULL, 0); XtManageChild(button); button = XmCreatePushButton(submenu, "Jump", NULL, 0); XtManageChild(button); button = XmCreatePushButton(submenu, "Stop", NULL, 0); XtManageChild(button); XtVaSetValues(menuButton, DtNsubMenuId, submenu, NULL); /* Create a pixmap using the menu button's colors and depth */ XtVaGetValues(menuButton, XmNforeground, &fg, XmNbackground, &bg, XmNdepth, &depth, NULL); cascadePixmap = XCreatePixmapFromBitmapData(XtDisplay (menuButton),DefaultRootWindow(XtDisplay (menuButton)), (char*)menu_glyph_bits, menu_glyph_width, menu_glyph_height, fg, bg, depth); XtVaSetValues(menuButton, DtNcascadePixmap, cascadePixmap, NULL); }