1

是否可以从 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 小部件。后者没有效果。前者给出一个错误,“警告:Widget 必须是 VendorShell。”

4

2 回答 2

1

我已经找到了一种方法来做到这一点。我发现我可以在创建 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);
于 2015-06-18T21:37:55.577 回答
0

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 函数没有正确的签名。

于 2015-06-19T16:12:46.080 回答