SophiaFramework UNIVERSE 5.3 |
レスポンダシステムとは、 レスポンダと呼ぶ GUI コンポーネントから構成される GUI フレームワークのことです。
レスポンダシステムには、 レスポンダ、 レスポンダツリー、 親レスポンダ、 子レスポンダ、 姉妹レスポンダ、 レスポンダ空間、 実領域、 仮想領域、 ローカル領域、 グローバル領域、 イベント、 トレーサ、 ハンドラ、 配信エンジン、 描画エンジン、 タイプ、 ID、 リファレンスなどの構成要素があります。
レスポンダには、 ウィンドウ、 メニュー、 ダイアログ、 コントロール、 テーブルビュー、 ルート、 フレームなどの種類があります。
レスポンダシステムを利用すれば、 イベント処理、 状態・ 透過属性・メモリの管理、 描画処理などの煩雑な処理が自動化されます。
SophiaFramework UNIVERSE 標準提供レスポンダクラスでは、 レスポンダの領域や状態、デザイン、内容などを変更したときに必要となる再描画は自動的に行われるように実装されています。
以下は、主な SophiaFramework UNIVERSE 標準提供レスポンダクラスの表です。
表 9.1. 主な SophiaFramework UNIVERSE 標準提供レスポンダクラス
クラス名 | 解説 |
---|---|
SFYApplication | アプリの中核となるアプリケーションクラスの雛型です。 このクラスを継承するアプリケーションクラスを 1 アプリにつき 1 つ実装する必要があります。 |
SFYResponder | GUI コンポーネントの共通機能を実装するクラスです。 すべてのレスポンダはこのクラスを継承します。 |
SFZRoot | ルートレスポンダとして設計されたレスポンダです。 ルートと呼ばれます。 SFYApplication クラスは、内部に 1 つだけルートを保持しています。 |
SFZContainer | コントロールやコンテナなどを配置する汎用コンテナです。 |
SFZWindow | コントロールやコンテナなどを配置する汎用ウィンドウです。 |
SFZDialog | コントロールやコンテナなどを配置する汎用ダイアログです。 |
SFZMessageDialog | 通知メッセージを表示するダイアログです。 |
SFZQuestionDialog | 選択メッセージを表示するダイアログです。 |
SFZGridMenu | グリッドメニューです。 |
SFZTextMenu | テキストメニューです。 |
SFZFlexListMenu | フレックスリストメニューです。 |
SFZTableView | テーブルモデルを表形式で操作するためのレスポンダです。 |
SFZSingleTextLabelControl | 単一行の編集不可能なテキストを表示するラベルコントロールです。 |
SFZSingleEditLabelControl | 単一行の編集可能なテキストを表示するラベルコントロールです。 |
SFZMultipleTextLabelControl | 複数行の編集不可能なテキストを表示するラベルコントロールです。 |
SFZMultipleEditLabelControl | 複数行の編集可能なテキストを表示するラベルコントロールです。 |
SFZImageLabelControl | イメージを表示するラベルコントロールです。 |
SFZSingleTextBoxControl | 単一行の編集不可能なテキストを表示するボックスコントロールです。 |
SFZSingleEditBoxControl | 単一行の編集可能なテキストを表示するボックスコントロールです。 |
SFZMultipleTextBoxControl | 複数行の編集不可能なテキストを表示するボックスコントロールです。 |
SFZMultipleEditBoxControl | 複数行の編集可能なテキストを表示するボックスコントロールです。 |
SFZImageBoxControl | イメージを表示するボックスコントロールです。 |
SFZTextButtonControl | テキストを表示するボタンコントロールです。 |
SFZImageButtonControl | イメージを表示するボタンコントロールです。 |
SFZComboBoxControl | コンボボックスコントロールです。 |
SFZListBoxControl | リストボックスコントロールです。 |
SFZFlexListBoxControl | フレックスリストボックスコントロールです。 |
SFZCheckboxControl | チェックボックスコントロールです。 |
SFZRadiobuttonControl | ラジオボタンコントロールです。 |
SFZTabControl | タブコントロールです。 |
SFZTabPage | タブコントロールのタブページです。 |
SFZScrollBarControl | スクロールバーコントロールです。 |
SFZContainerScrollBarControl | コンテナ専用スクロールバーコントロールです。 |
SFZSoftKeyControl | ソフトキー コントロールです。 |
SFZWebBrowserControl | 簡易ウェブブラウザコントロールです。 |
SFZPlainFrame | プレーンフレームです。 |
SFZFlatFrame | フラットフレームです。 |
SFZBevelFrame | ベベルフレームです。 |
SFZTitlePlainFrame | タイトル付きプレーンフレームです。 |
SFZTitleFlatFrame | タイトル付きフラットフレームです。 |
SFZTitleBevelFrame | タイトル付きベベルフレームです。 |
SFYImageWidget | イメージを表示するウィジェットです。 |
SFYSingleTextWidget | 単一行の編集不可能なテキストを表示するウィジェットです。 |
SFYSingleEditWidget | 単一行の編集可能なテキストを表示するウィジェットです。 |
SFYMultipleTextWidget | 複数行の編集不可能なテキストを表示するウィジェットです。 |
SFYMultipleEditWidget | 複数行の編集可能なテキストを表示するウィジェットです。 |
SFYWebBrowserWidget | 簡易ウェブブラウズ機能を提供するウィジェットです。 |
抽象レスポンダクラス | |
---|---|
SophiaFramework UNIVERSE では、 SFZ で始まる名前の具象レスポンダクラス以外に、 ユーザー定義レスポンダを作成するときに起点となる、 SFY で始まる名前の各種抽象レスポンダクラスも標準提供されます。 ただし、SFYImageWidget / SFYSingleTextWidget / SFYSingleEditWidget / SFYMultipleTextWidget / SFYMultipleEditWidget / SFYWebBrowserWidget の各クラスの名前は SFY で始まりますが、これらは抽象レスポンダクラスではなく具象レスポンダクラスです。 |
SFYApplication クラス | |
---|---|
SFYApplication クラスは SFYResponder クラスを継承していませんが、 領域やハンドラの処理などのレスポンダ操作を行えます。 レスポンダ操作は SFYApplication クラスが内部に保持するルート (SFZRoot)に委譲されて実行されます。 |
レスポンダシステムを利用したアプリ開発では、 最初に SFYApplication クラスを継承したアプリケーションクラスを 1 つ定義します。
AppWizard を利用してプロジェクトを作成する場合、 GUI フレームワークの選択画面で『使用する(SFY バージョン)』オプションを選択すると、 SFYApplication クラスを継承したアプリケーションクラスが 1 つ生成されます。
大文字アルファベットを含むアプリケーションクラス名(BREW 4.0 から) | |
---|---|
一般に、アプリケーションクラス名はアプリ本体と同じ名前にします。 BREW 4.0 からアプリの名前に大文字アルファベットが使えなくなりました。 "HelloWorld" や "USRApplication" などアプリケーションクラスの名前に大文字アルファベットを使う場合、 "helloworld" や "usrapplication" などのように大文字アルファベットを小文字アルファベットに変換してアプリ名にする必要があります。 |
アプリケーションクラス(ルート)内にウィンドウを作成するコードは以下の通りです。
例 9.1. ウィンドウの作成
SFCError USRApplication::MakeWindow(Void) { SFZWindowSmp window; SFCError error(SFERR_NO_ERROR); // ...(省略)... // ウィンドウのインスタンスを生成する if ((window = SFZWindow::NewInstance(&error)) != null) { // ウィンドウの親レスポンダを USRApplication アプリケーションクラスが保持するルートに設定する // ※SFYApplication::GetThis() により USRApplication アプリケーションクラスが保持するルートを取得する error = window->SetParent(GetThis()); if (error == SFERR_NO_ERROR) { // ウィンドウの実領域をルートのローカル領域から (10, 10) だけ Deflate した矩形に設定する // ※ルートのローカル領域はデフォルトでデバイス画面領域に初期化されている window->SetRealBound(GetLocalBound().Deflate(10, 10)); // ウィンドウの状態を「可視+活性+操作可能+フォーカス」にまとめて設定する window->SetState(true, true, true, true); // ウィンドウを最前面に移動する window->ToFront(); } } // ...(省略)... }
ウィンドウを作成する手順 | |
---|---|
|
参照: SFZWindow | SFYResponder::GetThis | SFYResponder::GetSuitableBound | SFYResponder::GetLocalBound | SFXRectangle::Deflate
ウィンドウ内にテキストボタンコントロールを作成するコードは以下の通りです。
例 9.2. テキストボタンコントロールの作成
SFCError USRApplication::MakeTextButtonControl(Void) { SFZWindowSmp window; SFZTextButtonControlSmp button; SFCError error(SFERR_NO_ERROR); // ...(省略)... // テキストボタンコントロールのインスタンスを生成する if ((button = SFZTextButtonControl::NewInstance(&error)) != null) { // テキストボタンコントロールの親レスポンダをウィンドウに設定する error = button->SetParent(window); if (error == SFERR_NO_ERROR) { // テキストボタンコントロールのラベルを "hello world" に設定する error = button->SetText("hello world"); if (error == SFERR_NO_ERROR) { // ウィンドウのローカル領域内にテキストボタンコントロールを表示するのに最適なサイズを確保し、開始点を(10, 10)に設定する button->SetRealBound(button->GetSuitableBound().SetOrigin(10, 10)); // テキストボタンコントロールの状態を「可視+活性+操作可能+フォーカス」にまとめて設定する button->SetState(true, true, true, true); } } } // ...(省略)... }
テキストボタンコントロールの作成する手順 | |
---|---|
|
ToFront 関数 | |
---|---|
コントロールは配置されるウィンドウやダイアログ、コンテナなどの親レスポンダが最前面に移動しない限り、 最前面に移動しません。 親レスポンダの SFYResponder::ToFront 関数を呼び出すと、 親レスポンダと一緒に子レスポンダであるコントロールも自動的に最前面に移動します。 |
参照: SFZWindow | SFZTextButtonControl | SFYResponder::GetSuitableBound | SFXRectangle::SetOrigin
テキストボタンコントロールを操作すると、 デバッグ出力に文字列を表示するコードは以下の通りです。
例 9.3. テキストボタンコントロールの使い方
SFZTextButtonControlSmp button; SFCError error(SFERR_NO_ERROR); // ...(省略)... // テキストボタンコントロールに OnResult 結果ハンドラを登録する error = button->RegisterHandler( SFXEventRange(SFEVT_RESPONDER_RESULT, SFEVT_RESPONDER_RESULT, SFP16_BEGIN, SFP16_END), XANDLER_INTERNAL(OnResult) ); // ...(省略)... // OnResult 結果ハンドラの実装 XANDLER_IMPLEMENT_VOIDRESULT(USRApplication, OnResult, invoker, reason, result) { // デバッグウィンドウに "Text button control has been pushed." と表示する TRACE("Text button control has been pushed."); return; }
結果ハンドラの登録と実装 | |
---|---|
SFYResponder::RegisterHandler 関数を使用して結果イベントのハンドラ(結果ハンドラ)をテキストボタンコントロールに登録します。 結果イベントを受信するハンドラ(結果ハンドラ)は XANDLER_IMPLEMENT_VOIDRESULT マクロを利用して実装します。 ※操作されると、テキストボタンコントロールは結果イベントを受信します。 |
以上のように、 ウィンドウ内にテキストボタンコントロールなどのコントロールを作成し、 コントロールの結果ハンドラを実装・登録するだけで GUI アプリを作成できます。
SFYApplication クラスは、 ウィンドウ、 ダイアログ、 メニュー、 コントロール、 フレームなどのレスポンダから階層的に構成される、 レスポンダツリーのルートレスポンダとして、 デフォルトのルート(SFZRoot)を 1 つ保持します。
SFY レスポンダシステムでは、 SFYApplication クラスが内部で保持するルートがウィンドウやダイアログ、メニューを管理し、 ウィンドウやダイアログがコントロールを管理するという階層構造になっています。
ウィンドウ、ダイアログ、メニューは同一階層に存在します。
コンテナはコントロールや 他のコンテナ(コンテナのみ)を管理したり、 コントロールや他のコンテナ(コンテナ・ウィンドウ・ダイアログ)に管理されることが可能な変則的な設計になっています。
フレーム | |
---|---|
タイトルや余白、枠線を備えたフレームをウィンドウやダイアログ、 メニューに装着することが可能です。 |
SFYApplication クラスが内部で保持するルート | |
---|---|
SFYApplication::SFYApplication コンストラクタの処理により、 SFYApplication クラスが内部で保持するルート (SFZRoot)には、 初期化された配信エンジンと 描画エンジンが自動的に関連付けれらます。 その結果、ルートを頂点とするレスポンダツリーを構築するだけで、 レスポンダツリーへのイベント配信と各レスポンダの再描画は自動的に行われます。 SFYApplication クラスを継承するアプリケーションクラスに対するレスポンダ操作は、 すべてルートに委譲されて実行されます。 ※ アプリケーションクラスに複数のルートを保持させることも可能ですが、 一般的なアプリ開発ではその必要性はほとんどありません。 |
すべてのレスポンダのクラスは SFYResponder クラスを継承します。
Copyright(c) 2002 - 2024 Sophia Cradle Incorporated All Rights Reserved. |