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



















