1

我有一个编译和工作程序,但我不知道如何将按钮放置在左上角以外的任何地方。

我需要在 rowcol 中指定位置(就像我现在一样),还是在使用 XtCreateManagedWidget 分配每个按钮时指定它们的位置?

请注意,我声明了回调,但我没有将它们包括在内,因为它们正在工作。

#include <stdio.h>
#include <Xm/Xm.h>
#include <Xm/ToggleB.h>
#include <Xm/RowColumn.h>

int main(int argc, char **argv)
{
  Widget shell, rowcol, toggle1, toggle2;
  XtAppContext app;

  //Set the window's size at 300x300
  shell = XtVaAppInitialize(&app, "Radio", NULL, 0, &argc, argv, NULL, 
            XmNwidth, 300, XmNheight, 300, NULL);

  //I want the buttons to start at 100x100
  rowcol = XtVaCreateWidget("rowcol", xmRowColumnWidgetClass, shell, 
            XmNx, 100, XmNy, 100, NULL);

  XtManageChild(rowcol);

  //Add the buttons & callbacks
  toggle1 = XtCreateManagedWidget("Switch1", xmToggleButtonWidgetClass, rowcol, NULL, 0);
  XtAddCallback(toggle1, XmNvalueChangedCallback, toggle1_cbk, NULL);

  toggle2 = XtCreateManagedWidget("Switch2", xmToggleButtonWidgetClass, rowcol, NULL, 0);
  XtAddCallback(toggle2, XmNvalueChangedCallback, toggle2_cbk, NULL);

  //Starts everything up
  XtRealizeWidget(shell);
  XtMainAppLoop(app);

  return 0;
}
4

1 回答 1

0

将您的小部件放在公告板上。

frame = XtVaCreateWidget("frame", xmBulletinBoardWidgetClass, shell, 
                         XmNwidth, 300, XmNheight, 300, NULL);

rowcol = XtVaCreateWidget("rowcol", xmRowColumnWidgetClass, frame,
                          XmNx, 100, XmNy, 100, NULL);

XtManageChild(frame);
XtManageChild(rowcol);

shell 的直接子代是特殊的。设置它的 X 和 Y 不会将孩子定位在 shell 中,而是 shell 本身。此外,许多小部件会忽略其子级的 X 和 Y 位置。但公告板没有。

来自 Motif 手册:

BulletinBoard 是一个通用管理器,允许将孩子放置在任意 x、y 位置。

于 2014-08-21T19:22:52.623 回答