WideStudio Programming (5-1)
~WSCbase

WSCbaseは、基底クラスを持たないデータ型クラスのようなものを除き、WideStudioで使われるすべてのパーツの基底クラスです。

WSCbase自体が持っている機能で重要なのは、まず何と言っても WSCbase という名前のクラスが存在することです。WideStuio のAPIで用いられるインターフェースは概ねすべて WSCbase* です。GUIパーツはもちろんNon GUIなパーツもすべてここから派生しています。WideStudioの各パーツはWSCbaseへのポインタとして受け渡されるので、必要に応じて派生クラスへのポインタにdynamic_castして利用します。

次に重要なのは、WSCbaseのレベルですべてのクラスのプロパティを取り扱えることです。プロパティというのはパーツの属性のことです。配置座標、背景色、表示される文字列、修飾、その他多くの属性があり、文字列で表現される名前をキーにして、動的に設定・取得出来ます。

WSCbase自体で定義されているプロパティは存在しませんが、一般的に使われるプロパティ(個々のパーツ名、可視属性、操作属性、など)の実体となるものはWSCbaseクラスのメンバ変数として定義されており、それらに対する内部的な操作もWSCbaseクラスで定義されています。これにプロパティとしての名前を付けて外部からアクセス出来るようにしているのは後述のWSCnwbaseクラスもしくはフォーム等の派生クラスです。

また、派生クラスで本体が定義される(WSCbaseには実体の無い)プロパティであってもプロパティにアクセスするための情報はWSCbaseに登録されているため、呼び出し側では単に「プロパティ名」を与えることで、プロパティ本体がどこにあっても、プロパティの情報がどの派生クラスで登録されていても、統一的にWSCbaseから操作出来るという仕掛けになっている、ようです。

イベントプロシージャについても同様に、WSCbaseクラスのポインタがあれば、派生クラスで登録されているイベントプロシージャを含めて、WSCbaseのインスタンスから呼び出すことが出来ます。

さらに、多くの派生クラスで共通的に使用出来る機能は(一部は virtualメンバ関数としてオーバーライド可能な形で)WSCbaseに定義されています。例えば draw() / redraw() 等の関数の実装はWSCbaseでは空っぽで、実際の処理は派生クラスで書かれることになる訳ですけれども、これをここから呼び出せるのはとても便利です。onMouseMove()のようなイベント発生時に呼び出される関数の多くも、ここで定義されています。

WSCbaseの使用例として、下記はタンゴレンのメインウィンドウでコンテキストメニューが表示された(または非表示にされた)時に呼び出されるイベントプロシージャです。

void CTGRMainWindow::ep_ContextMenu_VisibleCh(WSCbase* object)
{
    bool visible = (object->getVisible() != False);
    GetTGRUI()->SetPoppingContextMenuUpFlag(visible);
    if( !visible )
        return;
    WSCpopupMenu* menu = dynamic_cast<WSCpopupMenu*>(object);
    if( menu == NULL )
        return;
    CreateEditMenuItems(menu,RecallMainWindowPanelForTheObject(object),true);
}

まず WSCbase* として渡されたobject をそのまま使ってgetVisible() で表示状態を取得し、その先のメニュークラスのデータが必要になる局面では実体である WSCpopupMenu へのポインタに dynamic_castしています。

MWTのUIパーツの派生クラスにはdynamic_cast構文をサポートしていない古いコンパイラで動的キャストを可能とするためのメカニズムが実装されており、cast()メンバ関数を使ってdynamic_castと同様のことが出来ます。が、今どきわざわざこれを使う必然性は無いでしょう。

本家サイトのWSCbaseクラスの概要の説明と関数の一覧はこちら  http://www.widestudio.org/ja/ht-ref/WSCbase.html にあります。