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