"HelloWorld" プログラムを作ろう ( BREW 3.1 編 ) - 3 / 3 -
イベントハンドラ
ユーザーが携帯電話のキーを押したり、 BREW アプレットを中断したりするたびに、 BREW 実行環境は HelloWorld_HandleEvent() 関数を呼び出します。このような関数を "イベントハンドラ" と呼びます。
イベントハンドラは、 2 番目の引数にどのようなイベントが通知されたかを表すイベントコードを受け取ります。
たとえば、ユーザーが何かキーを押しますと、 BREW 実行環境は 2 番目の引数に EVT_KEY を指定してイベントハンドラを呼び出します。
開発者は EVT_KEY イベントに対して、特定の動作を記述することで、 BREW アプレットの振る舞いを実装します。
BREW ウィザードが生成したコードでは、 EVT_APP_START イベント (アプレットが開始しましたよ〜、という通知) と EVT_APP_STOP イベント (アプレットを終了しますよ〜、という通知) に対して処理を行っています。
// // HelloWorld アプレットのイベント ハンドラ // static boolean HelloWorld_HandleEvent( IApplet * pi, // アプレット構造体が渡される AEEEvent eCode, // イベント コード uint16 wParam, // イベント パラメータ (16ビット) uint32 dwParam) // イベント パラメータ (32ビット) { switch (eCode) { case EVT_APP_START: // ここにコードを追加します。 return TRUE; case EVT_APP_STOP: // ここにコードを追加します。 return TRUE; default: break; } return FALSE; }
イベント ハンドラでは、「アプレットが処理をした」イベントに対して TRUE を返し、「アプレットが処理をしない」イベントに対して FALSE を返さなければなりません。
ここでは EVT_APP_START イベントに対して TRUE を返すことで、 BREW 実行環境に対して「イベントを処理しましたよ〜」と通知しています。
このような仕組みになっている理由は、アプレットが処理しないイベント (FALSE を返したイベント) に対して、 BREW 実行環境がデフォルトの処理を行うことがあるからです。
画面への描画
それでは BREW アプレットが起動したタイミングで、携帯電話の画面に文字列を表示してみましょう。
以下のコードを見てください。分かりやすくするために、 EVT_APP_START イベントを処理するHelloWorld_OnAppStart という関数を定義しています。
新しい関数を定義するので、コードの最初の部分にある前方宣言に、
static void HelloWorld_OnAppStart(AEEApplet *app);
を加えてください。
// // イベント ハンドラ // static boolean HelloWorld_HandleEvent( IApplet * pi, // アプレット AEEEvent eCode, // イベントコード uint16 wParam, // イベント パラメータ (16ビット) uint32 dwParam) // イベント パラメータ (32ビット) { switch (eCode) { case EVT_APP_START: // ここにコードを追加します。 HelloWorld_OnAppStart((AEEApplet*) pi); return TRUE; case EVT_APP_STOP: // ここにコードを追加します。 return TRUE; default: break; } return FALSE; } // // アプレットが開始したときに呼び出される。 // static void HelloWorld_OnAppStart(AEEApplet* app) { AECHAR text[] = {'H','e','l','l','o',' ','W','o', 'r', 'l', 'd', '\0'}; // 画面ビットマップに文字列を表示する IDISPLAY_DrawText(app->m_pIDisplay, AEE_FONT_BOLD, // 太字のフォント text, // 表示する文字列 -1, // -1 = 文字列をすべて表示する 0, // 無視される 0, // 無視される NULL, // クリッピングしない IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE); // 左右中央揃え、上下中央揃え // 更新された画面ビットマップを表示する IDISPLAY_Update (app->m_pIDisplay); }
描画処理の詳細については今回は説明を行いません。ここに書いたとおり、そのまま入力してくださって結構です。
あれっ?と気づいた方おられるでしょう。 HelloWorld_HandleEvent() 関数の IApplet* 引数が AEEApplet* に強制キャストされています。
詳細は次回以降の連載で解説しますが、イベント ハンドラの第1引数には、 AEEClsCreateInstance() 関数で作成したアプレット構造体が渡されます。また、アプレット構造体は IApplet 構造体を拡張した構造体でなければならず、実際 AEEApplet は IApplet を拡張した形で定義されています。
したがって、 IApplet* の引数を AEEApplet* に強制キャストしても何も害はないということです。
BREWエミュレータ用にコンパイルする
さて、すべてのソースコードの準備ができました。もう一度すべてのファイルを確認してみましょう。Helloworld.bid と HelloWorld.mif は 他のファイルと同じフォルダ内に入れていますか?
ファイル | 説明 |
---|---|
HelloWorld.bid | HelloWorldアプレットのクラスIDを格納しているヘッダー ファイル。 |
HelloWorld.mif | HelloWorldモジュールのメタ情報を格納しているファイル。HelloWorldアプレットの情報をxml 形式で記述している。 |
AEEAppGen.c | BREWプロジェクトで共通に使われるソース ファイル。 |
AEEModGen.c | BREWプロジェクトで共通に使われるソース ファイル。 |
HelloWorld.c | HelloWorldアプレットを実装しているソース ファイル。 |
コンパイルを行うには、 メニューから [ビルド] - [ソリューションのビルド] を選択します。
ソースコードに誤りがなければ、正常にビルドが行われ、アウトプット ウィンドウに次のようなメッセージが表示されます。
HelloWorld.dll - エラー 0 警告 0
HelloWorld プロジェクト フォルダに、 HelloWorld.dll というファイルが作成されます。
BREW エミュレータで実行する
BREW エミュレータで動作させるためには、 HelloWorld.dll ファイルと HelloWorld.mif ファイルが必要です。この二つのファイルを次のような場所にコピーします。
C:\Applet\HelloWorld.mif
C:\Applet\HelloWorld\HelloWorld.dll
BREW エミュレータを起動します。デフォルトでは BREW SDK の Examples フォルダにある BREW アプレットがエミュレータ画面に表示されますので、エミュレータの読み取るフォルダを C:\Applet に変更する必要があります。
メニューから [ファイル] - [アプレットディレクトリの変更] を選択し、 [フォルダの参照] ダイアログで C:\Applet フォルダを選択して [OK] を押します。
最初のアイコンを選択した状態で画面に "Hello World" というタイトルが表示されていれば、 BREW エミュレータが MIF ファイルを認識している証拠です。この段階ではアプリケーション本体である .dll は実行されていません。
タイトルの "Hello World" というテキストは、 MIF ファイルの [アプレット] タブの [名前] 項目に入力したものが表示されます。
アイコンを選択した状態で Enter を押しましょう。画面中央に太字で "Hello World" と表示されたでしょうか。
おめでとうございます! 初めての BREW アプリケーションを作成することができました!
記事掲載プログラムのソースコード
SophiaFramework UNIVERSE を使用して作成したソースコード
yhelloworld_sf.zip (SophiaFramework UNIVERSE 5.1)