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);
}

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

在做了更多研究之后,我意识到我可能需要更改窗口属性,例如 via XChangeWindowAttributes(display, window, mask, values)。值的结构包括 a 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变量可能没有引用正确的窗口,我如何在知道外壳和包含的小部件的情况下获得对正确窗口的引用(如果这个问题没有得到牵引力,也许我应该从这个问题中提出一个单独的问题)?

4

1 回答 1

1

除非您在没有窗口管理器的情况下运行,否则边框的颜色很可能由您的窗口管理器控制。您需要在 ~/.Xdefaults 文件中覆盖该特定窗口的默认颜色。就像是:

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

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

于 2016-05-28T13:50:39.537 回答