Удалить кнопку закрытия из виджета BulletinBoard в Motif

Можно ли удалить кнопку закрытия из виджета BulletinBoard в Motif? Или, альтернативно, прикрепить к нему функцию обратного вызова? Я знаю, что могу сделать это для виджета верхнего уровня, но, похоже, не могу сделать это для BulletinBoard.

Для оболочки верхнего уровня я могу сделать это, чтобы прикрепить функцию обратного вызова к кнопке закрытия:

XmAddWMProtocolCallback(toplevel, XmInternAtom(display,"WM_DELETE_WINDOW",True),
        (XtCallbackProc)buttonCB, (XtPointer)data);

Или я могу удалить это полностью с этим:

XtVaSetValues(toplevel, XmNmwmFunctions, MWM_FUNC_ALL | MWM_FUNC_CLOSE, NULL);

Но ни один из них не работает для виджета BulletinBoard. Последнее не имеет никакого эффекта. Первый выдает ошибку "Предупреждение: виджет должен быть VendorShell".

2 ответа

Я нашел способ сделать это уже. Вместо использования XtVaSetValues ​​я обнаружил, что могу использовать XtSetArg(myBB, ...) во время создания виджета BB. Другими словами,

n=0;
XtSetArg(args[n], XmNheight, 300); n++;
XtSetArg(args[n], XmNwidth,  300); n++;
// ...etc...
XtSetArg(args[n], XmNmwmFunctions, MWM_FUNC_ALL|MWM_FUNC_CLOSE); n++;  // <--- answer
myBB = XmCreateBulletinBoardDialog(parent, "myBB", args, n);

Виджет XmBulletinBoard не имеет кнопки закрытия. Вы вызываете XmCreateBulletinBoardDialog, который создает XmDialogShell с дочерним элементом XmBulletinBoard.

Ваша попытка удалить кнопку закрытия диалога неверна.

Вы должны использовать

MWM_FUNC_ALL | MWM_FUNC_RESIZE | MWM_FUNC_MOVE | MWM_FUNC_MINIMIZE | MWM_FUNC_MAXIMIZE

Но гораздо лучше привязать кнопку закрытия к своему собственному методу, когда вы пытаетесь, за исключением того, что вы добавляете обратный вызов протокола к неправильному виджету - он нужен вам в DialogShell, а не в BulletinBoard. Так что используйте XtParent(myBB).

Кроме того, вы не должны разыгрывать buttonCB в своем вызове; если компилятор жалуется без приведения, ваша функция buttonCB не имеет правильной подписи.

Другие вопросы по тегам