ここでの根本的な問題は次のとおりです。ウィンドウ (より具体的には、ダイアログ ウィンドウ) の境界線の色を設定するにはどうすればよいですか?
警告を表示するダイアログ ウィンドウがあります。アラートの重大な安全性のため、ダイアログのウィンドウ境界を含むウィンドウの一部を赤くする必要があります。この要件を取り入れたとき、それは良い考えだと思いました。合理的で十分に単純に思えます。
アプリケーションは、グラフィックに 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)
。値の構造には が含まれており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
変数が正しいウィンドウを参照していない可能性があるためである場合、シェルと含まれているウィジェットを知っている正しいウィンドウへの参照を取得するにはどうすればよいですか)?