设置对话框 window 的边框颜色

Set dialog window's border color

这里的根本问题是:如何设置 window(更具体地说,对话框 window)周围的边框颜色?

我有一个对话框 window 会弹出一个警告。由于警报的关键安全性质,要求 window 的某些部分为红色,包括对话框的 window 边框。当我收到这个要求时,我认为这是个好主意。似乎很合理也很简单。

该应用程序对其图形使用 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);
}

我这样做是为了将它设置在从按钮到根目录以及介于两者之间的所有内容上。

经过更多研究后,我意识到我可能需要改为更改 window 属性,例如通过 XChangeWindowAttributes(display, window, mask, values)。值的结构包括 border_pixel,我假设它是边框颜色,但无法找到确认 - 文档只是说它用于设置 "the 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 可能是对根 window 的引用 - 也许这就是问题所在?

我对缺乏这方面的信息以及找到直接答案有多么困难感到惊讶。

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

边框的颜色很可能由您的 window 经理控制,除非您 运行 没有 window 经理。您需要覆盖 ~/.Xdefaults 文件中特定 window 的默认颜色。类似于:

[标题]*边框颜色:红色

其中 [title] 与您传递给 createShell() 的字符串相同。