У меня есть программа для компиляции и работы, но я не могу понять, как разместить кнопки где-нибудь, кроме верхнего левого.
Нужно ли указывать местоположение в 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;
}
Поместите свой виджет в доску объявлений.
frame = XtVaCreateWidget("frame", xmBulletinBoardWidgetClass, shell,
XmNwidth, 300, XmNheight, 300, NULL);
rowcol = XtVaCreateWidget("rowcol", xmRowColumnWidgetClass, frame,
XmNx, 100, XmNy, 100, NULL);
XtManageChild(frame);
XtManageChild(rowcol);
Непосредственный потомок оболочки особенный. Установка его X и Y не помещает дочерний элемент в оболочку, а скорее в саму оболочку. Кроме того, многие виджеты игнорируют позиции X и Y своих детей. Но BulletinBoard нет.
Из руководства по мотивам:
BulletinBoard — это менеджер общего назначения, который позволяет помещать детей в произвольные позиции x, y.