设置对话框窗口的边框颜色

3
这里的根本问题是:如何设置窗口周围(更具体地说,是对话框窗口)的边框颜色?
我有一个弹出警报的对话框窗口。由于警报的关键安全性质,有一个要求,即包括对话框窗口的窗口边框在内的某些部分应为红色。当我收到这个要求时,我觉得这是一个好主意。看起来很合理,也很简单。
该应用程序使用X/Motif进行其图形处理。我首先将其他请求的部分变成了红色,例如确认按钮。通过更改图形上下文和颜色资源,完成其他所有操作都很简单。
然而,对话框的边框一直是个麻烦事。有一个XmNborderColor资源,因此我尝试更改它。但似乎不起作用。最终,在尝试为不同的小部件(框架及其祖先)设置它之后,我做出了以下绝望的举动:
Widget w = button;

for(int i = 0; i <= 20; i += 1)
{
    printf("i = %d, w = %d\n", i, w);
    if(w <= 0) break;
    XtVaSetValues( w, XmNborderColor, border, NULL);
    w = XtParent(w);
}

我这么做是为了将其设置在从按钮到根之间的所有内容。

经过进一步研究,我意识到我可能需要更改窗口属性,例如通过 XChangeWindowAttributes(display, window, mask, values)。值结构包括一个 border_pixel,我假设它是边框颜色,但找不到确认 - 文档只是说它是用于设置 "边框像素"。幸运的是,有一个方便的函数只设置边框像素,这样您就不需要传递整个值结构; 只更改边框像素的便捷函数是 XSetWindowBorder(display, window, border_pixel)

所以我想尝试一下。现在我的代码如下:

// control_area is the widget containing the other 
XSetWindowBorder(XtDisplay(shell), window, border);

shell在其他地方通过以下函数设置:

Widget myClass :: createShell( Widget parent, string title )
{
    while( !XtIsApplicationShell(parent) )
    {
        parent = XtParent( parent );
    }

    shell = XtVaCreatePopupShell( name, xmDialogShellWidgetClass, parent,
        XtNvisual, visual, // visual, colormap, depth are class member variables
        XtNcolormap, colormap,
        XtNdepth, depth,
        NULL );

    XtVaSetValues( shell,
        XmNmwmDecorations, MWM_DECOR_BORDER,
        XtNtitle, const_cast<char*> (title.c_str()),
        XmNmwmFunctions, NO_FUNCTIONS,
        XmNresizePolicy, XmRESIZE_NONE,
        NULL );

    return shell;
}

从代码的另一个位置来看,window 可能是指根窗口的引用 - 或许这就是问题所在?

我对此缺乏信息并且很难找到直接的答案感到惊讶。

如何设置边框颜色?如果我应该使用 XSetWindowBorder(),那我做错了什么?如果因为我的 window 变量可能没有引用正确的窗口,我如何知道shell和包含的小部件来获取正确窗口的引用(如果此问题没有得到关注,也许我应该单独提出一个问题)?


1
大多数窗口都有零宽边框。WM框架(您可能正在尝试更改的内容)不是边框,您无法从Motif更改其颜色。 - n. m.
1个回答

1
边框的颜色很可能由您的窗口管理器控制,除非您没有运行窗口管理器。您需要在~/.Xdefaults文件中覆盖该特定窗口的默认颜色。类似这样的内容:
[title]*bordercolor: red
其中[title]与您传递给createShell()函数的字符串相同。

非常抱歉回复晚了。我没有~/.Xdefaults文件,但我已经找到了软件生效的资源文件。我尝试了你建议的方法,但还没有成功。这可能是我的问题,我会在有时间时仔细研究一下,然后再回来接受答案。 - Loduwijk
我刚刚注意到我在原回答中忘记了一个“:”号。检查一个你知道应该工作的应用程序,例如 XTerm*bordercolor: black 看看你是否能够获得你想要的效果,如果你无法通过自己的应用程序使其工作,则排除掉你的WM存在问题。 - FrodeTennebo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接