如何在 Xt/Motif 中创建两个顶层 windows?
How do I create two toplevel windows in Xt/Motif?
要创建示例顶层 window,可以执行以下代码。这显示在文档和 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);
}
但是,我找不到如何实现两个windows,如果我的应用程序想在顶层打开'n'独立windows,该怎么办?
在 X11 中甚至可能吗? (我认为这个问题可能与 Xt 库有关,而不是与 Motif 有关)。
如果是这样,有人可以给我指出一个例子或一段文档来了解如何做吗?
当然可以创建两个顶级windows。下面的示例创建了两个 windows,
一个带有“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) 因为我发现填充 Arg
s 并保持
XtSetArg(al[ac], XmNheight, 300); ac++;
的计数器跟踪非常无聊
并且可能容易出错,但这在这里并不重要。
一般来说,检查现实生活中的例子(现在主要是
legacy)Athena 或 Motif 程序,例如Xmgrace 和 Nedit,
Xmessage and Xedit.
要创建示例顶层 window,可以执行以下代码。这显示在文档和 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);
}
但是,我找不到如何实现两个windows,如果我的应用程序想在顶层打开'n'独立windows,该怎么办?
在 X11 中甚至可能吗? (我认为这个问题可能与 Xt 库有关,而不是与 Motif 有关)。
如果是这样,有人可以给我指出一个例子或一段文档来了解如何做吗?
当然可以创建两个顶级windows。下面的示例创建了两个 windows, 一个带有“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) 因为我发现填充 Arg
s 并保持
XtSetArg(al[ac], XmNheight, 300); ac++;
的计数器跟踪非常无聊
并且可能容易出错,但这在这里并不重要。
一般来说,检查现实生活中的例子(现在主要是 legacy)Athena 或 Motif 程序,例如Xmgrace 和 Nedit, Xmessage and Xedit.