ホーム > 製品情報 > SophiaFramework UNIVERSE > チュートリアル > BREW Cartoon

BREW Cartoon アプリ 〜 BREW C++ / GUI プログラミング 〜

Cartoon アプリの全体構成

Cartoonクラス

アプリ全体から参照される変数はここで定義します。

SFMTYPEDEFCLASS(Cartoon)
class Cartoon : public SFRApplication {
    SFMSEALCOPY(Cartoon)
private:
    // デバイスの画面サイズを保持
    SFXSize m_devsize;

    // 表示する画像番号を管理する変数 (0=はじまり, 1-4=画像番号, 5=おしまい)
    SIntN   m_pict_index;

    // 表示するビットマップを保持
    SFBBitmapSmp m_bitmap;

    // QVGA時には、拡大率として2が設定される。それ以外は、1が設定される。
    SIntN m_qvga_ratio;

    // 以下、メンバ関数
};

描画ハンドラ

アプリ開始時と、「戻る」や「進む」ボタンが押されたときに画面を描画します。

// 描画ハンドラの宣言
SFMTYPEDEFCLASS(Cartoon)
class Cartoon : public SFRApplication {
    ...
    
private:
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)

    ...
}

// 描画ハンドラの定義
HANDLER_IMPLEMENT_VOIDRENDER(Cartoon, OnRenderContent, graphics)
{
    // 画面を背景色でクリア
    graphics->FillRectangle(GetContentWorld(), SFXRGBColor(0, 192, 192, 255));

    // 画像の右上の座標のための値を計算
    SIntN blank1 = (m_devsize.GetWidth() - PICTSIZE) / 2;

    // ビットマップとナビゲート部分の間のピクセル数を計算
    SIntN blank2 = (m_devsize.GetHeight() - blank1 - PICTSIZE) / 4;

    // 画像を描画する矩形の描画
    graphics->SetForeColor(SFXRGBColor(0, 0, 0, 255));
    graphics->DrawRectangle(SFXRectangle(blank1 - 1, blank1 - 1, PICTSIZE + 2,
                PICTSIZE + 2));

    // ナビゲート部分を描画(戻る、拡大、進む)
    graphics->SetFillColor(SFXRGBColor(128, 128, 128, 255));
    graphics->DrawRoundRectangle(SFXRectangle(blank1, blank1 + blank2 + PICTSIZE,
    NAVI_WIDTH, NAVI_HEIGHT ),SFXSize(3, 3));
    graphics->DrawRoundRectangle(SFXRectangle(blank1 + NAVI_X_POS_2,
    blank1 + blank2 + PICTSIZE, NAVI_WIDTH, NAVI_HEIGHT ), SFXSize(3, 3));
    graphics->DrawRoundRectangle(SFXRectangle(blank1 + NAVI_X_POS_3,
    blank1 + blank2 + PICTSIZE, NAVI_WIDTH, NAVI_HEIGHT ), SFXSize(3, 3));

    graphics->SetForeColor(SFXRGBColor(0, 0, 0, 255));
    if (m_pict_index >= 1) {
        graphics->DrawText("戻る", SFXRectangle(blank1, blank1 + blank2 + PICTSIZE,
        NAVI_WIDTH, NAVI_HEIGHT ) );
    }
    if (1 <= m_pict_index && m_pict_index <= 4) {
        graphics->DrawText("拡大", SFXRectangle(blank1 + NAVI_X_POS_2,
        blank1 + blank2 + PICTSIZE, NAVI_WIDTH, NAVI_HEIGHT ) );
    }
    if (m_pict_index <= 4) {
        graphics->DrawText("進む", SFXRectangle(blank1 + NAVI_X_POS_3,
        blank1 + blank2 + PICTSIZE, NAVI_WIDTH, NAVI_HEIGHT ) );
    }

    // 画像部分を描画(以下省略)
}

キーハンドラ

左キー、右キー、セレクトキーが押されたときの処理を定義します。

// キーハンドラの宣言
SFMTYPEDEFCLASS(Cartoon)
class Cartoon : public SFRApplication {
    ...
    
private:
    HANDLER_DECLARE_BOOLEVENT(OnKey)

    ...
}

// キー ハンドラの定義
HANDLER_IMPLEMENT_BOOLEVENT(Cartoon, OnKey, event)
{
    UInt16 key = event.GetP16();
    switch (key) {
    case AVK_RIGHT: //右キーを押したとき
        if (m_pict_index <= 4) {
            m_pict_index++;                      // 次の画像
            m_bitmap = LoadBitmap(m_pict_index); // ビットマップをロード
            InvalidateContent();                 // 再描画処理要求
        }
        return true;
    
    case AVK_LEFT: //左キーを押したとき
        if (m_pict_index >= 1) {
            m_pict_index--;                      // 前の画像
            m_bitmap = LoadBitmap(m_pict_index); // ビットマップをロード
            InvalidateContent();                 // 再描画処理要求
        }
        return true;

    case AVK_SELECT: // セレクトキーを押したとき
        if (1 <= m_pict_index && m_pict_index <= 4) {
            new ImageWindow(this, GetContentWorld(), m_bitmap); //ImageWindow を生成
        }
        return true;
    }
    return false;
}

コンストラクタ

// コンストラクタ
Cartoon::Cartoon(Void)
{
    // 描画ハンドラの登録
    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)));
    }
    
    // …
}