前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework UNIVERSE 5.0

9.3. イベント処理

セレクト キーが押されると自動的に終了するように拡張した Hello World アプリを例にして、アプリの起動から終了までの全般的な流れを解説します。

例 9.8. セレクトキーで終了する Hello World アプリ : .hpp ファイル ( クラスの定義 )

//
//      HelloWorld.hpp
//
//      This source code was automatically
//      generated by SophiaFramework UNIVERSE 5.0.
//

#ifndef __HELLOWORLD_HPP
#define __HELLOWORLD_HPP

#include <SophiaFramework.hpp>
#include "HelloWorld.bid"

SFMTYPEDEFCLASS(HelloWorld)
class HelloWorld : public SFRApplication {
    SFMSEALCOPY(HelloWorld)
public:
    static SFCInvokerPtr Factory(Void);
private:
    HelloWorld(Void) static_throws;
    virtual ~HelloWorld(Void);
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
    HANDLER_DECLARE_BOOLEVENT(OnKey)
};

#endif // __HELLOWORLD_HPP //

例 9.9. セレクトキーで終了する Hello World アプリ : .cpp ファイル ( ブート ローダとファクトリ関数の実装、ハンドラの実装と登録 )

//
//      HelloWorld.cpp
//
//      This source code was automatically
//      generated by SophiaFramework UNIVERSE 5.0.
//

#include "HelloWorld.hpp"

// ブート ローダ
SFCApplet::FactorySPP SFCApplet::Boot(AEECLSID id, SFXAnsiStringPtr license)
{
    *license = "heap://";

    return (id == AEECLSID_HELLOWORLD) ? (&HelloWorld::Factory) : (null);
}

// ファクトリ関数
SFCInvokerPtr HelloWorld::Factory(Void)
{
    return ::new HelloWorld;
}

// コンストラクタ
HelloWorld::HelloWorld(Void) static_throws
{
    if (static_try()) {
        static_throw(RegisterHandler(SREVT_RESPONDER_RENDER, 
                                     SRP16_RENDER_CONTENT, 
                                     HANDLER_BEFORE, 
                                     HANDLER_FUNCTION(OnRenderContent)));
    }
    if (static_try()) {
        static_throw(RegisterHandler(SFEVT_KEY, 
                                     HANDLER_AFTER, 
                                     HANDLER_FUNCTION(OnKey)));
    }
    return;
}

// デストラクタ
HelloWorld::~HelloWorld(Void)
{
    return;
}

// 描画ハンドラ
HANDLER_IMPLEMENT_VOIDRENDER(HelloWorld, OnRenderContent, graphics)
{
    // 文字列 "Hello World" を画面に描画する
    graphics->DrawText("Hello World", GetContentWorld());
    return;
}

// キーハンドラ
HANDLER_IMPLEMENT_BOOLEVENT(HelloWorld, OnKey, event)
{
    // キーイベントの処理
    switch (event.GetP16()) {
        case AVK_SELECT:     // セレクトキーが押されとき
            Terminate();     // アプリを終了する
            return true;
    }
    return false;
}

最初の HelloWorld アプリから拡張した部分は、キー ハンドラの宣言、実装、登録です。

キーハンドラの宣言、実装、登録は、それぞれ HANDLER_DECLARE_BOOLEVENT 関数、HANDLER_IMPLEMENT_BOOLEVENT 関数、RegisterHandler 関数を使用します。 イベント ハンドラはコンストラクタで登録します。

アプリが起動されると、ブートローダ、ファクトリ関数、アプリのコンストラクタの順に実行されます。

アプリのインスタンスが作成されると、BREW からアプリに対して SFEVT_APP_START イベントが通知されます。上記コードでは SFEVT_APP_START イベントのハンドラを登録していないので、 SFRApplication クラスの ( 何も実行しない ) デフォルトハンドラが実行され、アプリの起動処理は完了します。

アプリはイベント待ちの状態となり、ユーザーからのキー入力やネットワークからのイベントなどに応じた処理が可能となります。

上記コードでは SFEVT_KEY イベントに対するハンドラを宣言、登録、実装しています。キーが押されると、キー ハンドラが呼び出されます。 キー ハンドラでは押されたキーの種類を判定し、セレクトキーが押された場合は Terminate 関数を呼び出してアプリを終了します。

アプリが終了プロセスに入ると、BREW から SFEVT_APP_STOP イベントが通知されます。上記のサンプルコードでは SFEVT_APP_STOP イベントのハンドラは登録されていませんので、 SFRApplicationクラスの ( 何も実行しない ) デフォルトハンドラが実行されます。

そして、アプリ クラスのデストラクタが呼び出され、アプリクラスのインスタンスが破棄されます。 最後にSophiaFramework UNIVERSE 内部で終了処理をした後、アプリは終了処理は完了します。 アプリ クラスのインスタンスが破棄されるとき、ウィンドウやコントロールなど UI コンポーネント ( レスポンダ ) も自動的に破棄されます。( UI コンポーネントの明示的な破棄は不要です )