是否可以从 Motif 中的公告板小部件中删除关闭按钮?或者,或者,将回调函数附加到它?我知道我可以为顶级小部件执行此操作,但似乎无法为公告板执行此操作。
对于顶级 shell,我可以这样做将回调函数附加到关闭按钮:
XmAddWMProtocolCallback(toplevel, XmInternAtom(display,"WM_DELETE_WINDOW",True),
(XtCallbackProc)buttonCB, (XtPointer)data);
或者我可以用这个完全删除它:
XtVaSetValues(toplevel, XmNmwmFunctions, MWM_FUNC_ALL | MWM_FUNC_CLOSE, NULL);
但这些都不适用于公告板小部件。后者没有效果。前者给出一个错误,"警告:小部件必须是VendorShell。
我已经找到了一种方法来做到这一点。我发现我可以在创建 BB 小部件时使用 XtSetArg(myBB,...),而不是使用 XtVaSetValues。换句话说,
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 上,而不是公告板上。所以使用XtParent(myBB)。
顺便说一句,你不应该在你的调用中强制转换buttonCB;如果编译器在没有强制转换的情况下抱怨,你的buttonCB函数没有正确的签名。