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

9.5. GUI フレームワークを使わないアプリ

HelloWorld アプリのコードを例に GUI フレームワークを使わないアプリ ( SFC アプリ ) の基本的な構造と動作の流れを説明します。

図 9.4. GUI フレームワークを使わない HelloWorld アプリ

GUI フレームワークを使わない HelloWorld アプリ

例 9.14. GUI フレームワークを使わない HelloWorld アプリ : .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 SFCApplication {
    SFMSEALCOPY(Helloworld)
public:
    static SFCInvokerPtr Factory(Void);
private:
    explicit Helloworld(Void) static_throws;
    virtual ~Helloworld(Void);
    virtual Bool Invoke(SFXEventConstRef event);
    Bool OnKey(UInt16 key);  //  キーハンドラ ( 普通の関数と同じように宣言する )
    Void Draw(Void);         // "Hello World" を描画する関数
};

#endif // __HELLOWORLD_HPP //

例 9.15. GUI フレームワークを使わない HelloWorld アプリ : ( ブート ローダ、ファクトリ関数、ハンドラの実装 )

//
//      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
{
    return;
}


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


// イベント ハンドラ
Bool Helloworld::Invoke(SFXEventConstRef event)
{
    Bool result(false);

    // イベントの種類に応じてハンドラを呼ぶ
    switch (event.GetType()) {
        case SFEVT_KEY:    // キー イベント
            result = OnKey(event.GetP16());
            break;
    }
    if (!result) {
        result = SFCApplication::Invoke(event);
    }
    return result;
}


// キー ハンドラ
Bool Helloworld::OnKey(UInt16 key)
{
    // キー イベントの処理
    switch (key) {
        case AVK_SELECT:    // セレクト キーが押されたとき
	      Draw();       // " HelloWorld " を描画する
            return true; 
    }
    return false;
}

// 文字列 "HelloWorld" を描画する
Void Helloworld::Draw(Void)
{
    // SFXGraphics インスタンスを取得する
    SFXGraphicsPtr graphics = SFXGraphics::GetInstance();

    // 画面を白色に塗りつぶす
    // SFXGraphics::GetDeviceRectangle() で画面全体( 長方形 )を取得する
    // SFXRGBColor(0xFF, 0xFF, 0xFF, 0x00) : 白色を表す
    graphics->FillRectangle(SFXGraphics::GetDeviceRectangle(),
                               SFXRGBColor(0xFF, 0xFF, 0xFF, 0x00));

    // 画面に "Hello World" 文字列を描画する
    // SFXRGBColor(0x00, 0x00, 0x00, 0x00) : 黒色を表す
    graphics->DrawText("Hello World", 
                          SFXGraphics::GetDeviceRectangle(),
                          SFXRGBColor(0x00, 0x00, 0x00, 0x00));

    // GUI フレームワークを使わないアプリでは必ず画面を更新する
    graphics->Update();
}

GUIフレームワークを使わない HelloWorld アプリ クラスは SFCApplication を継承します。

[Note] 注意

GUI フレームワークを使う場合は SFRApplication を継承します。

SFCApplication アプリでは、ハンドラ関数の宣言に HANDLER_DECLARE を使いません。例えば、キーハンドラ OnKey 関数は、通常の関数と同じように宣言します。

Invoke 関数は SFCApplication アプリのイベント ハンドラです。Invoke 関数は、受信したイベントに対応するハンドラ関数を呼び出します。

イベントは Invoke 関数の引数として渡され、イベントの type に応じて、ハンドラ関数が呼び出されます。キーイベントの場合、キー ハンドラ OnKey 関数が呼び出されます。

キー ハンドラ OnKey 関数でセレクト キーが押された場合、Draw 関数が呼び出されます。Draw 関数内で画面はクリアされ " Hello World " が描画されます。

[Caution] 注意

GUI フレームワークを使わないアプリでは、画面を更新するとき、必ず graphics->Update() を実行します。