前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク : SophiaFramework 3.0

4.1. AppWizard のソースコード

SophiaFramework AppWizard が生成したコードを元に、アプリの起動から終了までを解説します。

4.1.1. 起動コード

SophiaFramework のアプリは SFCApplet::Boot() 関数と、Factory() 関数を実装する必要があります。

//
//      HelloWorld.cpp
//

#include "HelloWorld.hpp"

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

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

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

4.1.2. アプリクラス(HelloWorld クラス)

GUI フレームワークを使うので、HelloWorld クラスは SFRApplication クラスを継承します。

//
//      HelloWorld.hpp
//

#ifndef __HELLOWORLD_HPP
#define __HELLOWORLD_HPP

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

//
//  HelloWorld アプリケーション クラス
//
SFMTYPEDEFCLASS(HelloWorld)
class HelloWorld : public SFRApplication {
    SFMSEALCOPY(HelloWorld)
public:
    static SFCInvokerPtr Factory(Void);
private:
    HelloWorld(Void) static_throws;
    virtual ~HelloWorld(Void);
    HANDLER_DECLARE_VOIDRENDER(HelloWorld, OnRenderContent)
    HANDLER_DECLARE_BOOLEVENT(HelloWorld, OnKey)
};

#endif // __HELLOWORLD_HPP //
[Note] 注意

現段階で重要でない部分 (エラー処理など) は灰色で表示しています。

4.1.3. イベントハンドラ

イベントハンドラは、アプリ開始や、キー押下などのイベントが発生した時に然るべき処理をする関数です。

描画ハンドラには描画時の処理を記述します。graphics->DrawText() 関数で画面に"Hello World"を表示します。

// 描画ハンドラ
HANDLER_IMPLEMENT_VOIDRENDER(HelloWorld, OnRenderContent, graphics)
{
    graphics->DrawText("Hello World", GetContentWorld());
    return;
}

キーハンドラにはキー押下時の処理を記述します。

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

4.1.4. イベントハンドラの登録

イベントハンドラを RegisterHandler 関数で登録します。引数として、イベントコード、イベントコードに付随するデータ、関数を呼び出すタイミング、関数ポインタを渡します。

// コンストラクタ
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;
}