next up previous contents
Next: イベント Up: Xt Intrinsicsを使う Previous: ウイジェットクラス

リソース

ウィジェットの色や位置、大きさ、表示形態等を指定するパラメータをリソー スと呼びます。リソースの仕組みはそれに標準値を与えたり個別の変更を系統 的にフレクシブルに出来るように用意されています。ウィジェットクラスには それ自身が扱えるリソースが定義されています。例えば先ほど見たLabelウィ ジェットクラスでは

        label           ラベル文字

        font            文字フォント

        justify         文字寄せの方向

        foreground              前景色

        background              背景色

        border          境界線の色

        borderWidth             境界線の太さ

        height          高さ

        width           幅

        x               水平位置

        y               垂直位置

        resize          サイズ変更の可否

などがリソースとして定義されています。リソースには名前がついています。 プログラムの中から参照するときは名前の前にXtNがついたシンボルが定義さ れているのでそれを使います。つづりのまちがいを防ぐためです。labelリソー スの名前はXtNlabelということになります。

Xtではリソースの名前に対して値を与えることでカスタマイズを行います。 ですから全てのウィジェットがユニークに識別される必要があります。同じ名 前のウィジェットでも親が違うことで識別できます。一番上位のウィジェット はXtInitializeで作りました。

        Widget  XtInitialize( name, class, options, num_options, argc, argv )

                char    *name;

                char    *class;

                XrmOptionDescRec*       options;

                Cardinal                num_options;

                Cardinal                *argc;

                char            *argv[];

ここで付けたnameが最上位のウィジェットの名前になります。アプリケーショ ンそのものの名前でもあります。それゆえmainで渡されるargvの最初の要素を 使うこともあります。それを実行したコマンド名ですね。このとき、classも 指定しました。この引数はアプリケーションクラスの名前を与えます。リソー スの標準値を定義するのに、コマンドごとに定義しなくても同じアプリケーショ ンクラスに属するアプリケーションが共通の定義を使うことが出来るようにな るわけです。同様にXtCreateManagedWidgetでは個別のウィジェットインスタ ンスに名前を付けましたが、それぞれがウィジェットクラスに属するわけです からウィジェットクラスのリソースを設定することも出来るわけです。クラス リソースの名前は大文字で始まります。上の例では前景色はForegroundとなり ます。プログラムの中で参照するときは前にXtCを付けてXtCForegroundとなり ます。これらを使って特定のリソースを記述します。左から右に向かって親か ら子の名前を.でつないでゆき、最後がリソース名です。.Xdefaultsのような リソースファイルの中では:で区切ってその後に設定する値を書きます。次の ようになります。

        hello.hello_world.label:        "Hello !! World!"

        Hello.Label.Foreground: red



最初の例ではhelloがアプリケーション名、hello\_worldがラベルインスタンス
の名前、最後のlabelがリソースを表わしています。次の例ではアプリケーショ
ンクラスHelloの下のLabelクラスのForegroundクラスリソースをredに設定し
ています。

\begin{verbatim}

        hello*background:       blue

.のかわりに*でウィジェット名を区切りました。この場合*の位置には中間の ウィジェットがいくつ入ってもよいワイルドカードになります。今の例ではこ れはhello.backgroundとhello.hello_world.backgroundをblueに設定すること になります。これらの設定によりこのプログラムhelloはウインドウに表示さ れるラベルがhello_worldではなくてHello!! Wo rld!になり、色も変わります。

次にプログラムの中でリソースを設定する方法を見ていきましょう。Xt Intrinsicsではリソースの値の制御は全てArg構造体を用いて行います。Arg構 造体にリソースの名前と値を代入して、その構造体を使ってXtSetValues関数 を呼びます。リソースの値を読みだすときも同じ構造体を使ってXtGetValues 関数を呼びます。リソースによってはウィジェットが作られるときに指定しな ければならないものもあります。それらはXtCreateManagedWidge tを呼び出す ときにこのArg構造体でリソース指定を行います。

        Widget  widget;

        Arg     args[3];

        int     n;



        n = 0;

        XtSetArg( args[ n ], XtNlabel, "Hello!! World!" );      n++;

        XtSetArg( args[ n ], XtNwidth, 200 );           n++;

        XtSetArg( args[ n ], XtNheight, 100 );          n++;



        XtSetValues( widget, args, n );

XtSetArgはマクロです。最初の引数が2度参照されるのでargs[ n++ ]とは書け ません。Ar g構造体を用いずに値をセットする関数もあります。可変長の引数 を扱えるものでXtの後にVaのついた関数です。例えば上の例は

        XtVaSetValues( widget,

                        XtNlabel, ( XtArgVal ) "Hello!! World!",

                        XtNwidth, ( XtArgVal ) 200,

                        XtNheight, ( XtArgVal ) 100,

                        NULL );

最後のNULLが引数リストの終わりを表わします。XtCreateWidgetと同じ機能の 関数XtVaCr eateWidgetもあります。

このようにプログラムの中ではウィジェットはWidget型変数として特定でき ますからそれぞれのリソース名を指定するだけでいいわけです。



next up previous contents
Next: イベント Up: Xt Intrinsicsを使う Previous: ウイジェットクラス



Kinya Hibino
Sun Jan 14 21:50:32 JST 1996