这里的根本问题是:如何设置窗口边框的颜色(更具体地说,是对话框窗口)?
我有一个弹出警报的对话窗口。由于警报的关键安全性,要求窗口的某些部分为红色,包括对话框的窗口边框。当我得到这个要求时,我认为这是一个好主意。似乎合理而简单。
该应用程序使用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和包含的小部件来获取对正确窗口的引用(如果这个问题,我可能会从这个问题中单独提出一个问题没有牵引力??
答案 0 :(得分:1)
除非您在没有窗口管理器的情况下运行,否则边框的颜色很可能由窗口管理器控制。您需要覆盖〜/ .Xdefaults文件中该特定窗口的默认颜色。类似的东西:
[title] * bordercolor:red
其中[title]与传递给createShell()的字符串相同。