这里的根本问题是:如何设置窗口(更具体地说,对话窗口)周围边框的颜色?
我有一个对话窗口弹出一个警告。由于警报的关键安全性质,要求窗口的某些部分为红色,包括对话框的窗口边框。当我收到这个要求时,我认为这是个好主意。看起来很合理也很简单。
应用程序使用 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 和包含的小部件的情况下获得对正确窗口的引用(也许我应该从这个问题中提出一个单独的问题如果这个问题没有得到关注)?
最佳答案
除非您在没有窗口管理器的情况下运行,否则边框的颜色很可能由您的窗口管理器控制。您需要在 ~/.Xdefaults 文件中覆盖该特定窗口的默认颜色。像这样的东西:
[标题]*边框颜色:红色
其中 [title] 与您传递给 createShell() 的字符串相同。
关于c++ - 设置对话框窗口的边框颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37197624/