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))); } // … }