如何在 Xt/Motif 中创建两个顶级窗口?

问题描述

要创建示例顶级窗口,可以执行以下代码。这在文档和 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,&argc,argv,0);

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


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


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

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

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

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

解决方法

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

#include <Xm/Label.h>

int main(int argc,char **argv) {
  XtAppContext app;
  Widget       t1,t2,l1,l2;

  t1 = XtVaOpenApplication(&app,"w1",NULL,&argc,argv,sessionShellWidgetClass,NULL);
  
  l1 = XtVaCreateManagedWidget("first",xmLabelWidgetClass,t1,NULL);

  /* Or applicationShellWidgetClass,topLevelShellWidgetClass,... */
  t2 = XtVaCreatePopupShell("w2",NULL);

  l2 = XtVaCreateManagedWidget("sec",NULL);

  XtRealizeWidget(t1);
  XtPopup(t2,XtGrabNone);
  XtAppMainLoop(app);
  return(0);
}

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

一般来说,检查现实生活中的(现在主要是 遗留)Athena 或 Motif 程序,例如Xmgrace 和 Nedit, Xmessage and Xedit

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...