如何解决如何在 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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。