【问题标题】:How do I create two toplevel windows in Xt/Motif?如何在 Xt/Motif 中创建两个顶层窗口?
【发布时间】:2021-04-22 02:31:16
【问题描述】:

要创建示例顶层窗口,可以完成以下代码。这显示在文档和 Motif 书籍中(具体而言,此示例基于 Marshall Brain 的“Motif Essentials, Programming and More”)。

#include <Xm/Xm.h>
#include <Xm/PushB.h>
#include <Xm/RowColumn.h>

XtAppContext    context;
XmStringCharSet char_set=XmSTRING_DEFAULT_CHARSET;

Widget          toplevel;
Widget          pulldownMenu, optionMenu;
Widget          optionMenuItem1;
Widget          optionMenuItem2;

Widget addMenuItem(char *itemName, XtPointer clientData, Widget menuWidget) {

        int ac;
        Arg al[10];
        Widget item;

        ac=0;
        XtSetArg(al[ac],XmNlabelString, XmStringCreateLtoR(itemName, char_set)); ac++;
        item=XmCreatePushButton(menuWidget,itemName,al,ac);
        XtManageChild(item);
        /*XtAddCallback(item,XmNactivateCallback,menuCB,clientData);*/
        XtSetSensitive(item,True);
        return(item);

}

int main(int argc, char *argv[]){

        Arg             al[10];
        int             ac;

        /* CREATE TOP LEVEL */
        toplevel = XtAppInitialize(&context, "test1", NULL, 0, &argc, argv, NULL, NULL, 0);

        /* RESIZE TOP LEVEL */
        ac=0;
        XtSetArg(al[ac], XmNheight, 300); ac++;
        XtSetArg(al[ac], XmNwidth, 300); ac++;
        XtSetValues(toplevel, al, ac);


        /* CREATE OPTIONS MENU */
        pulldownMenu=XmCreatePulldownMenu(toplevel, "pulldownMenu",NULL,0);
        optionMenuItem1 = addMenuItem("item1", "Item 1", pulldownMenu);
        optionMenuItem2 = addMenuItem("item2", "Item 2", pulldownMenu);
        ac=0;
        XtSetArg(al[ac], XmNsubMenuId, pulldownMenu); ac++;
        XtSetArg(al[ac], XmNlabelString, XmStringCreateLtoR("Sample",char_set)); ac++;
        optionMenu = XmCreateOptionMenu(toplevel, "optionMenu", al, ac);
        XtManageChild(optionMenu);


        /* DISPLAY TOP LEVEL */
        XtRealizeWidget(toplevel);
        XtAppMainLoop(context);
}

但是,我找不到如何实现两个窗口,如果我的应用程序想在顶层打开'n'个独立的窗口,该怎么办?

在 X11 中甚至可能吗? (我认为这个问题可能与 Xt 库有关,而不是与 Motif 相关)。

如果是这样,有人可以指点我一个示例或一段文档以了解如何操作吗?

【问题讨论】:

    标签: unix x11 xlib motif


    【解决方案1】:

    当然可以创建两个顶级窗口。下面的示例创建了两个窗口, 一个带有“first”标签,另一个带有“sec”标签。

    #include <Xm/Label.h>
    
    int main(int argc, char **argv) {
      XtAppContext app;
      Widget       t1, t2, l1, l2;
    
      t1 = XtVaOpenApplication(&app, "w1", NULL, 0, &argc, argv, NULL,
                                     sessionShellWidgetClass, NULL);
      
      l1 = XtVaCreateManagedWidget("first", xmLabelWidgetClass, t1, NULL);
    
      /* Or applicationShellWidgetClass, topLevelShellWidgetClass, ... */
      t2 = XtVaCreatePopupShell("w2", sessionShellWidgetClass, t1, NULL);
    
      l2 = XtVaCreateManagedWidget("sec", xmLabelWidgetClass, t2, NULL);
    
      XtRealizeWidget(t1);
      XtPopup(t2, XtGrabNone);
      XtAppMainLoop(app);
      return(0);
    }
    

    我使用了可变参数函数 (XtVa),因为我发现填充 Args 并保持 跟踪XtSetArg(al[ac], XmNheight, 300); ac++; 的柜台很无聊 并且可能容易出错,但这在这里并不重要。

    一般来说,您可能会受益于检查现实生活中的示例(现在主要是 遗留)Athena 或 Motif 程序,例如Xmgrace 和 Nedit, Xmessage and Xedit.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多