前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3

9.15. ダイアログ(基礎編)

ダイアログは、 ルート[SFZRoot]内に配置されるように設計されたレスポンダです。

すべてのダイアログは SFZDialog クラスを継承し、 実領域よりも大きく設定された仮想領域のスクロール機能とフォーカスの移動機能に加え、 タイマー機能(詳細: SFZDialog::ScheduleTimer 関数の解説)とデフォルトのキー操作機能を提供します。

たとえば、 SFZMessageDialogSFZQuestionDialog などのダイアログは、 このクラスを継承して実装しています。

ウィンドウと同様にコントロールを配置するためのコンテナとして利用できますが、 ダイアログは一時的な画面を表示しユーザーに結果を選択させる目的で使用します。

具象ダイアログはアプリ開発ですぐに使うことができる部品であり、 抽象ダイアログはカスタマイズされたユーザー定義ダイアログを作成するための起点(基底クラス)となります。

表 9.14. 具象ダイアログの種類

クラス名 解説
SFZDialog コントロールやコンテナなどを配置する汎用ダイアログです。
SFZMessageDialog 通知メッセージを表示するダイアログです。
SFZQuestionDialog 選択メッセージを表示するダイアログです。
[Important] 重要

すべての具象ダイアログにおいて、 SFYResponder::SetParent 関数、 SFYResponder::SetState 関数、 SFYResponder::SetRealBound 関数の呼び出しは必須です。

その他の関数の呼び出しは省略可能です。

SFYResponder::SetFrame 関数を呼び出してフレームをダイアログに装着する場合、 フレームの SFYResponder::SetRealBound 関数を呼び出すと、 ダイアログの実領域がフレーム余白領域に合わせて自動的に設定されるので、SFYResponder::SetRealBound 関数の呼び出しは省略されます。

[Note] デフォルトの背景色

SFZDialog では、 SFYWidget::SetBackgroundColor 関数で設定する背景色がデフォルトで灰色[SFXRGBColor(0xEE, 0xEE, 0xEE,0x00)]に設定されています。

表 9.15. 抽象ダイアログの種類

クラス名 解説
SFZDialog ダイアログを表す抽象クラスです。

9.15.1. コントロールやコンテナなどを配置する汎用ダイアログ[SFZDialog]

汎用ダイアログ[SFZDialog]は、 各種コントロールやコンテナを配置するための汎用的なダイアログとして機能します。

図 9.37. 動作例

動作例

コントロールやコンテナが配置されている場合、 SFYContainer::SetScrollDownKey / SFYContainer::SetScrollUpKey / SFYContainer::SetPageDownKey / SFYContainer::SetPageUpKey / SFYContainer::SetSnapDownKey / SFYContainer::SetSnapUpKey 関数で設定するスクロールキーでフォーカスの移動機能を利用できます。

仮想領域実領域よりも大きい場合は、 フォーカス移動機能と連動した、仮想領域の上下方向へのスクロール機能も利用できます。

デフォルトの実装では、 汎用ダイアログ[SFZDialog]は下記の結果イベント[SFEVT_RESPONDER_RESULT]を受信します。

開発者は、これらのイベントを受信するハンドラを登録できます。 デフォルトのハンドラは、ダイアログを閉じる処理だけを行います。

ダイアログ操作キーは、SFZDialog::SetOperateKey 関数を使用して設定します。 デフォルトでは、セレクトキーがダイアログ操作キーとして割り当てられています。

ESCAPE キーは、SFZDialog::SetEscapeKey 関数を使用して設定します。 デフォルトでは、クリアキーが ESCAPE キーとして割り当てられています。

[Note] タイマーのキャンセル

SFZDialog::ScheduleTimer 関数で設定したタイマー処理は、 ダイアログ操作キー、ESCAPE キー、またはOK ボタンを押したときに自動的にキャンセルされます。

サスペンド時もタイマーはキャンセルされますが、 レジューム時に SFZDialog::ScheduleTimer 関数の引数に指定した時間でタイマー処理は再開されます。

ダイアログの有効状態が無効になったときもタイマーはキャンセルされます。

[Note] デフォルトの背景色

SFZDialog では、 SFYWidget::SetBackgroundColor 関数で設定する背景色がデフォルトで灰色[SFXRGBColor(0xEE, 0xEE, 0xEE,0x00)]に設定されています。

例 9.68. 宣言

SFMTYPEDEFCLASS(USRApplication)
class USRApplication: public SFYApplication {
    SFMSEALCOPY(USRApplication)
private:
    SFZDialogSmp _dialog;

    // ...(省略)...
private:
    SFCError Make(Void);

    // ダイアログ選択結果イベントを受信するハンドラ
    XANDLER_DECLARE_VOIDRESULT(OnResult)
};

例 9.69. 実装

SFCError USRApplication::Make(Void)
{
    SFCError error(SFERR_NO_ERROR);

    // ダイアログを作成する
    if ((_dialog = SFZDialog::NewInstance(&error)) != null) {

        // ダイアログの親レスポンダを USRApplication に設定する
        error = _dialog->SetParent(GetThis());
        if (error == SFERR_NO_ERROR) {

            // ダイアログ選択結果イベントを受信するハンドラを登録する
            error = _dialog->RegisterHandler(
                SFXEventRange(SFEVT_RESPONDER_RESULT, SFEVT_RESPONDER_RESULT, SFP16_BEGIN, SFP16_END),
                XANDLER_INTERNAL(OnResult)
            );
            if (error == SFERR_NO_ERROR) {

                // 携帯画面領域を (10, 10) だけ縮小した領域をヒント領域にして
                // ダイアログに最適な領域を取得しヒント領域内の中央に配置し、
                // ダイアログの実領域に設定する
                _dialog->SetRealBound(_dialog->GetSuitableBound(GetLocalBound().Deflate(10, 10), SFYResponder::HORIZONTAL_CENTER, SFYResponder::VERTICAL_MIDDLE));

                // ダイアログの状態を「可視+活性+操作可能+フォーカス」にまとめて設定する
                _dialog->SetState(true, true, true, true);

                // ダイアログを最前面に移動する
                _dialog->ToFront();
            }
        }
    }

    return error;
}

// ダイアログ選択結果イベントを受信するハンドラ
XANDLER_IMPLEMENT_VOIDRESULT(USRApplication, OnResult, invoker, reason, result)
{
    // invoker にはダイアログが渡される
    // reason には結果イベントの P16 値が渡される
    // result には 0 が渡される

    switch (reason) {

        case SFP16_RESULT_OK:

            // 操作キー押下時

            // ...(省略)...
            break;

        case SFP16_RESULT_ESCAPE:

            // ESCAPE キー押下時、またはScheduleTimer 関数で設定した時間が経過した時

            // ...(省略)...
            break;
    }

    // ダイアログを閉じる
    invoker->Terminate();
    // "_dialog->Terminate();" と記述しても良い

    return;
}

図 9.38. 枠とタイトルの付いたダイアログ[SFZDialog]


枠とタイトルの付いたダイアログ[SFZDialog]

ダイアログ[SFZDialog]に枠線やタイトルを付けるためのサンプルコードは SFZDialog を参照してください。

9.15.2. 通知メッセージを表示するダイアログ[SFZMessageDialog]

通知メッセージを表示するダイアログ[SFZMessageDialog]は、 アイコン画像、 メッセージテキスト、 OK ボタンから構成されます。

それぞれの要素は省略することも可能です(Set 関数で何も設定しなかった場合、省略されたものとみなされます)。

図 9.39. 動作例

動作例

アイコン画像、 メッセージテキスト、 OK ボタンは、それぞれ SFZImageLabelControlSFZMultipleTextLabelControlSFZTextButtonControl のインスタンスとして内部で保持されています。 これらのインスタンスを取得するための API も用意されています。

アイコン画像とメッセージテキストは、操作不能状態に設定されているので、これらにフォーカスを移動できません。 OK ボタンだけが操作可能状態に設定されているので、ダイアログにフォーカスが移動すると、 OK ボタンもフォーカスを持つことになります。

SFZMessageDialog::SetIconImage 関数、 SFZMessageDialog::SetMessageText 関数、 SFZMessageDialog::SetButtonText 関数を使用してアイコン画像やメッセージ、ボタンのテキストを設定しなかった場合、 それらは省略されたことになり、 ダイアログには表示されません。

デフォルトの実装では、 通知メッセージを表示するダイアログ[SFZMessageDialog]は 下記の結果イベント[SFEVT_RESPONDER_RESULT]を受信します。

開発者は、これらのイベントを受信するハンドラを登録できます。 デフォルトのハンドラは、ダイアログを閉じる処理だけを行います。

ダイアログ操作キーは、SFZDialog::SetOperateKey 関数を使用して設定します。 OK ボタンを操作するためのボタン操作キーは、SFYButtonControl::SetOperateKey 関数を使用して設定します。 デフォルトでは、セレクトキーがダイアログ操作キーとボタン操作キーとして割り当てられています。 ボタンが表示されている場合、セレクトキーはボタン操作キーとして処理されます。

ESCAPE キーは、SFZDialog::SetEscapeKey 関数を使用して設定します。 デフォルトでは、クリアキーが ESCAPE キーとして割り当てられています。

[Note] タイマーのキャンセル

SFZDialog::ScheduleTimer 関数で設定したタイマー処理は、 ダイアログ操作キー、ESCAPE キー、またはOK ボタンを押したときに自動的にキャンセルされます。

サスペンド時もタイマーはキャンセルされますが、 レジューム時に SFZDialog::ScheduleTimer 関数の引数に指定した時間でタイマー処理は再開されます。

ダイアログの有効状態が無効になったときもタイマーはキャンセルされます。

[Note] ダイアログ操作キーによるダイアログの処理

OK ボタンを省略したり、操作不能状態に設定した場合、 ダイアログはダイアログ操作キーで操作します。デフォルトの実装では、OK ボタンを押したときの動作と同じになります。

つまり、ダイアログ操作キーを押すと (SFEVT_RESPONDER_RESULT, SFP16_RESULT_OK) イベントが送信されてダイアログは閉じることになります。 この機能は、警告文だけのボタンを持たないダイアログを表示し、ダイアログ操作キーの押下でダイアログを閉じる場面などで利用できます。

[Note] デフォルトの背景色

SFZMessageDialog では、 SFYWidget::SetBackgroundColor 関数で設定する背景色がデフォルトで灰色[SFXRGBColor(0xEE, 0xEE, 0xEE,0x00)]に設定されています。

例 9.70. 宣言

SFMTYPEDEFCLASS(USRApplication)
class USRApplication: public SFYApplication {
    SFMSEALCOPY(USRApplication)
private:
    SFZMessageDialogSmp _dialog;

    // ...(省略)...
private:
    SFCError Make(Void);

    // ダイアログ選択結果イベントを受信するハンドラ
    XANDLER_DECLARE_VOIDRESULT(OnResult)
};

例 9.71. 実装

SFCError USRApplication::Make(Void)
{
    SFCError error(SFERR_NO_ERROR);

    // ダイアログを作成する
    if ((_dialog = SFZMessageDialog::NewInstance(&error)) != null) {

        // ダイアログの親レスポンダを USRApplication に設定する
        error = _dialog->SetParent(GetThis());
        if (error == SFERR_NO_ERROR) {

            // ダイアログ選択結果イベントを受信するハンドラを登録する
            error = _dialog->RegisterHandler(
                SFXEventRange(SFEVT_RESPONDER_RESULT, SFEVT_RESPONDER_RESULT, SFP16_BEGIN, SFP16_END),
                XANDLER_INTERNAL(OnResult)
            );
            if (error == SFERR_NO_ERROR) {

                // アイコンに表示するイメージを設定する
                // SFBImage オブジェクトの設定 ( リソースファイルやファイルから設定可能 )
                error = _dialog->SetIconImage(SFXPath("resource.bar"), IMAGE_ID);
                if (error == SFERR_NO_ERROR) {

                    // メッセージに表示するテキストを設定する
                    // SFXWideString オブジェクトの設定 (※リソースファイルから設定することも可能)
                    error = _dialog->SetMessageText("hello world\n\nThis is a notification message.");
                    if (error == SFERR_NO_ERROR) {

                        // OK ボタンに表示するテキストを設定する
                        // SFXWideString オブジェクトの設定 (※リソースファイルから設定することも可能)
                        error = _dialog->SetButtonText("OK");
                        if (error == SFERR_NO_ERROR) {

                            // 携帯画面領域を (10, 10) だけ縮小した領域をヒント領域にして
                            // ダイアログに最適な領域を取得しヒント領域内の中央に配置し、
                            // ダイアログの実領域に設定する
                            _dialog->SetRealBound(_dialog->GetSuitableBound(GetLocalBound().Deflate(10, 10), SFYResponder::HORIZONTAL_CENTER, SFYResponder::VERTICAL_MIDDLE));

                            // ダイアログの状態を「可視+活性+操作可能+フォーカス」にまとめて設定する
                            _dialog->SetState(true, true, true, true);

                            // ダイアログを最前面に移動する
                            _dialog->ToFront();
                        }
                    }
                }
            }
        }
    }

    return error;
}

// ダイアログ選択結果イベントを受信するハンドラ
XANDLER_IMPLEMENT_VOIDRESULT(USRApplication, OnResult, invoker, reason, result)
{
    // invoker にはダイアログが渡される
    // reason には結果イベントの P16 値が渡される
    // result には 0 が渡される

    switch (reason) {

        case SFP16_RESULT_OK:

            // OK ボタン押下時、または操作キー押下時

            // ...(省略)...
            break;

        case SFP16_RESULT_ESCAPE:

            // ESCAPE キー押下時、またはScheduleTimer 関数で設定した時間が経過した時

            // ...(省略)...
            break;
    }

    // ダイアログを閉じる
    invoker->Terminate();
    // "_dialog->Terminate();" と記述しても良い

    return;
}

図 9.40. 枠とタイトルの付いたダイアログ[SFZMessageDialog]


枠とタイトルの付いたダイアログ[SFZMessageDialog]

ダイアログ[SFZMessageDialog]に枠線やタイトルを付けるためのサンプルコードは SFZMessageDialog を参照してください。

9.15.3. 選択メッセージを表示するダイアログ[SFZQuestionDialog]

選択メッセージを表示するダイアログ[SFZQuestionDialog]は、 アイコン画像、 メッセージテキスト、 その他ボタン・OK ボタン・キャンセルボタンから構成されます。

それぞれの要素は省略することも可能です(Set 関数で何も設定しなかった場合、省略されたものとみなされます)。

図 9.41. 動作例

動作例

アイコン画像、 メッセージテキスト、 その他ボタン・OK ボタン・キャンセルボタンは、それぞれ SFZImageLabelControlSFZMultipleTextLabelControlSFZTextButtonControl のインスタンスとして内部で保持されています。 これらのインスタンスを取得するための API も用意されています。

アイコン画像とメッセージテキストは、操作不能状態に設定されているので、これらにフォーカスを移動できません。 その他ボタン、OK ボタン、キャンセルボタンは操作可能状態に設定されているので、 SFYContainer::SetScrollUpKeySFYContainer::SetScrollDownKey 関数で設定するスクロールキーを使用してフォーカス移動できます。 なお、最初にダイアログの画面が表示された段階では、 SFZQuestionDialog::SetButtonText 関数を使用して最後にテキストを設定したボタンがフォーカスを持ちます。

SFZQuestionDialog::SetIconImage 関数、 SFZQuestionDialog::SetMessageText 関数、 SFZQuestionDialog::SetButtonText 関数を使用してアイコン画像やメッセージ、ボタンのテキストを設定しなかった場合、 それらは省略されたことになり、 ダイアログには表示されません。

デフォルトの実装では、 選択メッセージを表示するダイアログ[SFZQuestionDialog]は 下記の結果イベント[SFEVT_RESPONDER_RESULT]を受信します。

開発者は、これらのイベントを受信するハンドラを登録できます。 デフォルトのハンドラは、ダイアログを閉じる処理だけを行います。

ダイアログ操作キーは、SFZDialog::SetOperateKey 関数を使用して設定します。 その他ボタン、OK ボタン、キャンセルボタンを操作するためのボタン操作キーは、 SFYButtonControl::SetOperateKey 関数を使用して設定します。 デフォルトでは、セレクトキーがダイアログ操作キーとボタン操作キーとして割り当てられています。 ボタンが表示されている場合、セレクトキーはボタン操作キーとして処理されます。

ESCAPE キーは、SFZDialog::SetEscapeKey 関数を使用して設定します。 デフォルトでは、クリアキーが ESCAPE キーとして割り当てられています。

[Note] タイマーのキャンセル

SFZDialog::ScheduleTimer 関数で設定したタイマー処理は、 ダイアログ操作キー、ESCAPE キー、OK ボタン、キャンセルボタン、またはその他ボタンを押したときに自動的にキャンセルされます。

サスペンド時もタイマーはキャンセルされますが、 レジューム時に SFZDialog::ScheduleTimer 関数の引数に指定した時間でタイマー処理は再開されます。

ダイアログの有効状態が無効になったときもタイマーはキャンセルされます。

[Note] ダイアログ操作キーによるダイアログの処理

すべてのボタンを省略したり、操作不能状態に設定した場合、 ダイアログはダイアログ操作キーで操作します。デフォルトの実装では、OK ボタンを押したときの動作と同じになります。

つまり、ダイアログ操作キーを押すと (SFEVT_RESPONDER_RESULT, SFP16_RESULT_OK) イベントが送信されてダイアログは閉じることになります。 この機能は、警告文だけのボタンを持たないダイアログを表示し、ダイアログ操作キーの押下でダイアログを閉じる場面などで利用できます。

[Note] デフォルトの背景色

SFZQuestionDialog では、 SFYWidget::SetBackgroundColor 関数で設定する背景色がデフォルトで灰色[SFXRGBColor(0xEE, 0xEE, 0xEE,0x00)]に設定されています。

例 9.72. 宣言

SFMTYPEDEFCLASS(USRApplication)
class USRApplication: public SFYApplication {
    SFMSEALCOPY(USRApplication)
private:
    SFZQuestionDialogSmp _dialog;

    // ...(省略)...
private:
    SFCError Make(Void);

    // ダイアログ選択の結果イベントを受信するハンドラ
    XANDLER_DECLARE_VOIDRESULT(OnResult)
};

例 9.73. 実装

SFCError USRApplication::Make(Void)
{
    SFCError error(SFERR_NO_ERROR);

    // ダイアログを作成する
    if ((_dialog = SFZQuestionDialog::NewInstance(&error)) != null) {

        // ダイアログの親レスポンダを USRApplication に設定する
        error = _dialog->SetParent(GetThis());
        if (error == SFERR_NO_ERROR) {

            // ダイアログ選択の結果イベントを受信するハンドラを登録する
            error = _dialog->RegisterHandler(
                SFXEventRange(SFEVT_RESPONDER_RESULT, SFEVT_RESPONDER_RESULT, SFP16_BEGIN, SFP16_END),
                XANDLER_INTERNAL(OnResult)
            );
            if (error == SFERR_NO_ERROR) {

                // アイコンに表示するイメージを設定する
                // SFBImage オブジェクトの設定 ( リソースファイルやファイルから設定可能 )
                error = _dialog->SetIconImage(SFXPath("resource.bar"), IMAGE_ID);
                if (error == SFERR_NO_ERROR) {

                    // メッセージに表示するテキストを設定する
                    // SFXWideString オブジェクトの設定 (※リソースファイルから設定することも可能)
                    error = _dialog->SetMessageText("hello world\n\nThis is a question message.");
                    if (error == SFERR_NO_ERROR) {

                        // その他ボタンに表示するテキストを設定する
                        // SFXWideString オブジェクトの設定 (※リソースファイルから設定することも可能)
                        error = _dialog->SetButtonText(SFZQuestionDialog::BUTTON_ANOTHER, "ANOTHER");
                        if (error == SFERR_NO_ERROR) {

                            // キャンセルボタンに表示するテキストを設定する
                            // SFXWideString オブジェクトの設定 (※リソースファイルから設定することも可能)
                            error = _dialog->SetButtonText(SFZQuestionDialog::BUTTON_CANCEL, "CANCEL");
                            if (error == SFERR_NO_ERROR) {

                                // OK ボタンに表示するテキストを設定する
                                // 最後に OK ボタンにテキストを設定したので、始めに OK ボタンがフォーカス状態で表示される
                                // SFXWideString オブジェクトの設定 (※リソースファイルから設定することも可能)
                                error = _dialog->SetButtonText(SFZQuestionDialog::BUTTON_OK, "OK");
                                if (error == SFERR_NO_ERROR) {

                                    // 携帯画面領域を (10, 10) だけ縮小した領域をヒント領域にして
                                    // ダイアログに最適な領域を取得しヒント領域内の中央に配置し、
                                    // ダイアログの実領域に設定する
                                    _dialog->SetRealBound(_dialog->GetSuitableBound(GetLocalBound().Deflate(10, 10), SFYResponder::HORIZONTAL_CENTER, SFYResponder::VERTICAL_MIDDLE));

                                    // ダイアログの状態を「可視+活性+操作可能+フォーカス」にまとめて設定する
                                    _dialog->SetState(true, true, true, true);

                                    // ダイアログを最前面に移動する
                                    _dialog->ToFront();
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    return error;
}

// ダイアログ選択の結果イベントを受信するハンドラ
XANDLER_IMPLEMENT_VOIDRESULT(USRApplication, OnResult, invoker, reason, result)
{
    // invoker にはダイアログが渡される
    // reason には結果イベントの P16 値が渡される
    // result には 0 が渡される

    switch (reason) {

        case SFP16_RESULT_OK:

            // OK ボタン押下時、または操作キー押下時

            // ...(省略)...
            break;

        case SFP16_RESULT_CANCEL:

            // キャンセルボタン押下時

            // ...(省略)...
            break;

        case SFP16_RESULT_ANOTHER:

            // その他ボタン押下時

            // ...(省略)...
            break;

        case SFP16_RESULT_ESCAPE:

            // ESCAPE キー押下時、またはScheduleTimer 関数で設定した時間が経過した時

            // ...(省略)...
            break;
    }

    // ダイアログを閉じる
    invoker->Terminate();
    // "_dialog->Terminate();" と記述しても良い

    return;
}

図 9.42. 枠とタイトルの付いたダイアログ[SFZQuestionDialog]


枠とタイトルの付いたダイアログ[SFZQuestionDialog]

ダイアログ[SFZQuestionDialog]に枠線やタイトルを付けるためのサンプルコードは SFZQuestionDialog を参照してください。

9.15.4. ダイアログを表す抽象クラスとしての汎用ダイアログ[SFZDialog]

SFZDialog は各種ダイアログを実装するための起点(基底クラス)となります。

たとえば、 SFZMessageDialogSFZQuestionDialog などのダイアログは、 SFZDialog クラスを継承して実装しています。

SFZDialog は、 一定時間経過後に自動的にダイアログを閉じる機能、 実領域よりも大きな仮想領域のスクロール機能とフォーカスの移動機能、 およびダイアログ操作キーや ESCAPE キー、スクロールキーの管理を実装し、 いくつかの仮想関数(ハンドラ)の動作をデフォルトで実装します。

コントロールやコンテナが配置されている場合、 SFYContainer::SetScrollUpKeySFYContainer::SetScrollDownKey 関数で設定するスクロールキーを使用してフォーカス移動できます。 仮想領域実領域よりも大きい場合は、 フォーカス移動機能と連動した、仮想領域の上下方向へのスクロール機能も利用できます。

デフォルトの実装では、 抽象ダイアログ [SFZDialog]は 下記の結果イベント[SFEVT_RESPONDER_RESULT]を受信します。

開発者は、これらのイベントを受信するハンドラを登録できます。 デフォルトのハンドラは、ダイアログを閉じる処理だけを行います。

ダイアログ操作キーは、SFZDialog::SetOperateKey 関数を使用して設定します。 デフォルトでは、セレクトキーがダイアログ操作キーとして割り当てられています。

ESCAPE キーは、SFZDialog::SetEscapeKey 関数を使用して設定します。 デフォルトでは、クリアキーが ESCAPE キーとして割り当てられています。

[Note] タイマーのキャンセル

SFZDialog::ScheduleTimer 関数で設定したタイマー処理は、 ダイアログ操作キーまたは ESCAPE キーを押したときに自動的にキャンセルされます。

サスペンド時もタイマーはキャンセルされますが、 レジューム時に SFZDialog::ScheduleTimer 関数の引数に指定した時間でタイマー処理は再開されます。

ダイアログの有効状態が無効になったときもタイマーはキャンセルされます。

SFZDialog を継承するレスポンダでは、 SFZDialog::SFZDialog / SFYContainer::SFYContainer / SFYWidget::SFYWidget コンストラクタで登録されたハンドラの処理により、 下記のイベントを受信すると、対応する下記の仮想関数(ハンドラ)が最初に呼び出されます。 その後、開発者がレスポンダに登録したハンドラが呼び出されることになります。

[Note] 注意

ハンドラの詳細については、 SFZDialog::SFZDialog / SFYContainer::SFYContainer / SFYWidget::SFYWidget コンストラクタの解説を参照してください。

[Tip] Tip

ハンドラを登録する手間を省略できるので、 通常、これらのイベント処理は仮想関数をオーバーライドして記述します。

表 9.16. イベント、仮想関数(ハンドラ)とデフォルト動作

イベント 仮想関数(ハンドラ) デフォルトの動作 オーバーライド
SFZDialog::SetOperateKey で設定されたダイアログ操作キーの SFEVT_KEY イベント SFZDialog::HandleOperateKey イベントを送信する※1 任意
SFZDialog::SetEscapeKey で設定された ESCAPE キーの SFEVT_KEY イベント SFZDialog::HandleEscapeKey イベントを送信する※2 任意
SFYContainer::SetScrollUpKey で設定された ScrollUp キーの SFEVT_KEY イベント SFYContainer::HandleScrollUpKey 仮想領域を上方向にスクロールする※3 任意
SFYContainer::SetScrollDownKey で設定された ScrollDown キーの SFEVT_KEY イベント SFYContainer::HandleScrollDownKey 仮想領域を下方向にスクロールする※4 任意
SFYContainer::SetPageUpKey で設定された PageUp キーの SFEVT_KEY イベント SFYContainer::HandlePageUpKey 仮想領域を上方向に 1 ページ分スクロールする※5 任意
SFYContainer::SetPageDownKey で設定された PageDown キーの SFEVT_KEY イベント SFYContainer::HandlePageDownKey 仮想領域を下方向に 1 ページ分スクロールする※6 任意
SFYContainer::SetSnapUpKey で設定された SnapUp キーの SFEVT_KEY イベント SFYContainer::HandleSnapUpKey 仮想領域を上端までスクロールする※7 任意
SFYContainer::SetSnapDownKey で設定された SnapDown キーの SFEVT_KEY イベント SFYContainer::HandleSnapDownKey 仮想領域を下端までスクロールする※8 任意
(SFEVT_RESPONDER_BOUND, SFP16_BOUND_REQUEST) イベント SFYWidget::HandleBoundRequest 推奨
(SFEVT_RESPONDER_BOUND, SFP16_BOUND_OPTIMIZE) イベント SFYWidget::HandleBoundOptimize 推奨
(SFEVT_RESPONDER_BOUND, SFP16_BOUND_REAL) イベント SFYWidget::HandleBoundReal 任意
(SFEVT_RESPONDER_BOUND, SFP16_BOUND_VIRTUAL) イベント SFYWidget::HandleBoundVirtual 任意
(SFEVT_RESPONDER_BOUND, SFP16_BOUND_GLOBAL) イベント SFYWidget::HandleBoundGlobal 非推奨[廃止予定]
(SFEVT_RESPONDER_RENDER, SFP16_RENDER_REQUEST) イベント SFYWidget::HandleRenderRequest 任意

※デフォルトの動作にある "−" は何も実装していないことを表す。

[Note] 注釈

※1.SFYResponder::InvokeForward(SFXEvent(SFEVT_RESPONDER_RESULT, SFP16_RESULT_OK, 0), false) を実行します。 SFZDialog::HandleOperateKey 関数を呼び出す直前に、 SFZDialog::ScheduleTimer 関数で設定したタイマー処理をキャンセルする操作が内部的に行われます。

※2.SFYResponder::InvokeForward(SFXEvent(SFEVT_RESPONDER_RESULT, SFP16_RESULT_ESCAPE, 0), false) を実行します。 SFZDialog::HandleEscapeKey 関数を呼び出す直前に、 SFZDialog::ScheduleTimer 関数で設定したタイマー処理をキャンセルする操作が内部的に行われます。

※3.SFYContainer::ScrollUp 関数を実行します。

※4.SFYContainer::ScrollDown 関数を実行します。

※5.SFYContainer::PageUp 関数を実行します。

※6.SFYContainer::PageDown 関数を実行します。

※7.SFYContainer::SnapUp 関数を実行します。

※8.SFYContainer::SnapDown 関数を実行します。

以下にユーザー定義ダイアログを作成するときに最低限必要なコードを示します。

例 9.74. 宣言

SFMTYPEDEFRESPONDER(USRDialog)
class USRDialog: public SFZDialog {
    SFMSEALRESPONDER(USRDialog)
    SFMRESPONDERINSTANTIATEFIVE(USRDialog, SFZDialog, SFZWindow, SFYContainer, SFYWidget, SFYResponder)
public:

    // レスポンダのタイプを定義する
    // 小文字と記号のみからなるタイプは予約されているので使えない
    enum CodeEnum {
        CODE_TYPE = four_char_code('U', 'D', 'L', 'G')
    };
    SFMTYPEDEFTYPE(CodeEnum)

public:
    static USRDialogSmp NewInstance(SFCErrorPtr exception = null);
protected:
    explicit USRDialog(Void) static_throws;
    virtual ~USRDialog(Void);

    // 親クラスで定義されている仮想関数のうち、実装が推奨される仮想関数
    virtual Void HandleBoundRequest(SFXRectanglePtr rectangle) const;
    virtual Void HandleBoundOptimize(SFXRectanglePtr rectangle) const;
    virtual Void HandleBoundReal(Void);
    virtual Void HandleBoundVirtual(Void);
    virtual Void HandleRenderRequest(SFXGraphicsPtr graphics) const;
};

例 9.75. 実装

USRDialog::USRDialog(Void) static_throws
{
    if (static_try()) {

        // レスポンダのタイプを設定する
        SetType(CODE_TYPE);

        // 初期化処理を記述する
    }
}

USRDialog::~USRDialog(Void)
{
    // 終了処理を記述する
}

USRDialogSmp USRDialog::NewInstance(SFCErrorPtr exception)
{
    return static_pointer_cast<USRDialog>(Factory(::new USRDialog, exception));
}

Void USRDialog::HandleBoundRequest(SFXRectanglePtr rectangle) const
{
    // ダイアログに最適な大きさを計算して rectangle パラメータに設定する
    // この関数内では、rectangle の原点は変更せず、rectangle のサイズだけを設定する(推奨)

    return;
}

Void USRDialog::HandleBoundOptimize(SFXRectanglePtr rectangle) const
{
    // ダイアログに最適な大きさを rectangle パラメータ内の大きさに
    // 収まるように計算し、rectangle パラメータに設定する
    // この関数内では、rectangle の原点は変更せず、rectangle のサイズだけを設定する(推奨)

    return;
}

Void USRDialog::HandleBoundReal(Void)
{
    // 実領域が変更された場合に再計算が必要なものがあれば、ここに記述する

    return;
}

Void USRDialog::HandleBoundVirtual(Void)
{
    // 仮想領域が変更された場合に再計算が必要なものがあれば、ここに記述する

    return;
}

Void USRDialog::HandleRenderRequest(SFXGraphicsPtr graphics) const
{
    // ダイアログを描画する

    return;
}