では実際に色々なウインドウのパーツであるウィジェットの作り方を見てい きましょう。ウィジェットを実装するために、Xt Intrinsicsではクラスとイ ンスタンスというオブジェクト指向の概念を導入します。例えば四角いボタン も丸いボタンもマウスでクリックするとなにかするとか、押された状態と放さ れた状態があるとか文字が書かれているとか共通の属性があります。それらを まとめて一つの属性と考えたものがクラスです。ボタンというクラスを考えま しょう。四角いボタンはボタンクラスの属性を全て持っていますが、さらに四 角いという形状を属性として持っています。「四角いボタン」クラスはボタン クラスの性質を継承して作られます。画面に実際に表示されるのはあるクラス に属する実際のもの「インスタンス」です。画面に赤い四角いボタンと青い四 角いボタンがあるとします。そのいずれもが「四角いボタン」クラスのインス タンスですが、一つ一つの働きは違うようにプログラムできます。Xtでは、ク ラスを定義するクラス構造体とインスタンスを定義するインスタンス構造体の 両方で一つのウイジェットを定義します。クラス構造体ではより共通性の高い クラスで定義できることはそちらで定義させ、その属性を「継承」します。イ ンスタンス構造体はウイジェットが作成されるときに確保されウイジェットが 破棄されると解放されます。
ここで継承という言葉が出ると親子関係を連想しますが、ウインドウの親子 関係と継承は関係ありません。ウインドウの親子関係はインスタンス同士の関 係であり、無関係なクラスのインスタンス同士であることが普通です。 XtCreateManagedWidgetではある親の下にあるクラスのインスタンスとしてウィ ジェットを作ります。XtCreateManagedWidget関数は次のように定義されます。
Widget XtCreateManagedWidget( name, widget_class, parent, args, num_args ) String name; WidgetClass widget_class; Widget parent; ArgList args; Cardinal num_args;
全てのウィジェットには名前を付けます。ウィジェットの持つ様々な属性をリ ソースと呼びますがそれを実行時にも設定できるように名前を付けておきます。 次のwidget_class
でクラスを指定します。「四角いボタン」クラスなどです。実際にはクラス構 造体変数へのポインターです。次に親ウィジェットを指定し、必要ならばその 後に引数を渡します。必要ないときは先の例のようにNULL、0を与えます。次 の例を見てください。
#include <Xm/RowColumn.h> #include <Xm/PushB.h> Widget pushbutton, rowcolumn; rowcolumn = XtCreateManagedWidget( "panel", xmRowColumnWidgetClass, toplevel, NULL, 0 ); pushbutton = XtCreateManagedWidget( "quitbutton", xmPushButtonWidgetClass, rowcolumn, NULL, 0 );
何かしらrowcolumnというウィジェットがtoplevelの子として作られました。 その次にそのrowcolumnを親にしてpushbuttonが作られています。名前は quitbutton、ウィジェットクラスはxmPushButtonWidgetClassで、定義は Xm/PushB.hに書かれています。引数はありません。ウィジェットのデータはウィ ジェットクラス構造体から取られます。
作られたウィジェットはまだ表示はされません。データが準備されるだけで す。実際に表示するにはXtRealizeWidgetを呼びます。引数はWidgetです。表 示させる必要がなくなったときはXtUnrealizeWidgetしますが、データは残さ れています。割り当てられた資源を開放するためにはXtDestroyWidgetを呼び ます。先程も説明したように親がリアライズされるとその親にマネージされる 全ての子ウィジェットもリアライズされます。ですから通常は一番上のウィジェッ トをリアライズすればいいことになります。
XtRealizeWidget( toplevel );
アプリケーションによっては複数のウインドウを使って仕事をしたい場合が あります。その場合それぞれのウインドウがリアライズされているかどうか調 べる必要があります。そのための関数はXtIsRealizedです。引数にウィジェッ トを与えます。
どのようなウィジェットクラスが用意されているかはウィジェットセットご とに違います。後で主にMotifと、簡単にOpenlookについて見ることにします。