Mobile:NEWS |
2003年11月7日 00:32 AM 更新
|
BREW プログラミング入門(3)
画面に描画をしてみよう(1/3)
前回の連載では、HelloWorldアプレットを作成することで、BREWアプリケーションのおおまかな構造について学びました。今回は画面描画のAPIについて詳しく説明するとともに、インタフェースやアプレット構造体についての理解を深めます。
前回の連載では(第二回参照)、HelloWorldアプレットを作成することで、BREWアプリケーションのおおまかな構造について学びました。今回は画面描画のAPIについて詳しく説明するとともに、インタフェースやアプレット構造体についての理解を深めます。
四角形を描画するアプレット
前回は、アプレット開始時に、携帯電話の画面に "Hello Worldと表示しました。今回はまず、前回のおさらいの意味も含めて、青色の背景に赤色の四角形を表示するSquareアプレットを作成してみます。
全ソースコードはこのようになります(クリックで別ウィンドウにソースコード表示)。
AEEClsCreateInstance() 関数と、Shape_HandleEvent() 関数の実装は、前回のHelloWorldアプレットと何も変わっていません。今回は Square_OnAppStart() 関数の中で行われている描画処理について完全に理解することを目標にしましょう。
アプレット構造体 AEEApplet
前回はアプレット構造体AEEAppletの実体について何一つ触れませんでしたので、今回は詳細を調べてみたいと思います。残念ながら、「BREW APIリファレンス」にはAEEAppletについて何も書かれていません。「BREW SDKユーザーズガイド」にわずかな記述があるだけです。
このような場合は、BREW SDKのヘッダー ファイルを直接調べてみるのが有効な手段です。AEEAppletはBREW SDKをインストールしたフォルダのinc\AEEAppGen.hで定義されていますので、このファイルを開いてみましょう。
Visual C++ 6では、ソース冒頭にある #include "AEEAppGen.h"の部分を右クリックして現れるメニューから、[ドキュメント"AEEAppGen.h"を開く] を選択することで、即座にファイルを開くことができます。
AEEAppGen.h を調べてみると、次のような宣言があることが分かります。
struct _AEEApplet
{
DECLARE_VTBL(IApplet)
AEECLSID clsID; // アプレットのクラスID
uint32 m_nRefs; // アプレットの参照カウント
IShell * m_pIShell; // IShell オブジェクト
IModule * m_pIModule; // IModule オブジェクト
IDisplay * m_pIDisplay; // IDisplay オブジェクト
AEEHANDLER pAppHandleEvent; // アプレットのイベント ハンドラ関数
PFNFREEAPPDATA pFreeAppData; // アプレット解放時に呼び出される関数
};
typedef struct _AEEApplet AEEApplet;
|
|
今の段階ではすべてを理解する必要はありません。アプレット構造体は、クラスIDとイベント ハンドラのほかに、いくつかの変数を持つことが分かります。
おそらく、AEEClsCreateInstance()関数内でAEEApplet_New()関数を呼び出すと、これらのメンバ変数が初期化されるのでしょう(AEEApplet_New()関数の実装はAEEAppGen.cで定義されています。特に知る必要はありませんが、余力のある方は覗いてみましょう)。
IShell、IModule、IDisplayなど、先頭に"I"がつく型は、"インタフェース"と呼ばれる構造体です。BREWプログラミングでは、この "インタフェース" を理解することが基本となります。
オブジェクトとインタフェース関数
BREW APIは、"オブジェクト" に作用する "インタフェース関数"として提供されます。難しい言葉が出てきました。"オブジェクト" とは何でしょうか?"インタフェース関数" とは何でしょうか?
何も難しくありません。BREWのオブジェクトとインタフェース関数について話す前に、C言語のライブラリの一般的な設計についてお話します。
例えば、C言語で書かれたリンクリストのライブラリを考えてみましょう。そのライブラリは、リンクリストを表す構造体と、その構造体を操作するための関数を提供しますよね。
このようなデータ構造体のことを、BREWでは"オブジェクト"と呼びます。また、データ構造体を操作する関数を"インタフェース関数"と呼びます。
このように、プログラムをデータ構造体とそれを操作するための関数として整理し、設計することを、「オブジェクト指向プログラミング」といいます。C++やJavaを習得している方であれば、すでにご存知ですよね。BREW APIはC言語でオブジェクト指向設計されたAPIなのです。
BREWでは、データ構造体とインタフェース関数をまとめたものを、"インタフェース"と呼んでいます。
BREWの "オブジェクト" のことを、"インタフェース オブジェクト"と呼んだり、"インスタンス"あるいは "インタフェース インスタンス"と呼ぶこともありますが、すべて同じ意味です。
BREWの"オブジェクト"は、JavaやC++のオブジェクトとほぼ同じであり、BREWの"インタフェース"は、JavaやC++のクラスとほぼ同じです。
具体例で説明しましょう。BREWプログラミングで必ず使用するインタフェースとして、"IShellインタフェース"があります。IShellオブジェクトとはまさにBREW実行環境を表現したデータ構造体であり、IShellインターフェイスはBREW実行環境を操作するための関数群です。
例えば、BREWが実行されている携帯電話端末の画面サイズを取得するには、次のようにします(AEEDeviceInfoは、携帯電話端末の情報を格納するための構造体です。詳細は「BREW APIリファレンス」を参照してください)。
static void Square_OnAppStart(AEEApplet* app)
{
IShell* shell;
AEEDeviceInfo devinfo;
int width, height;
// IShellオブジェクトを取得する。
shell = app->m_pIShell;
// IShellインターフェイス関数を使用して、画面サイズを取得する。
ISHELL_GetDeviceInfo(shell, &devinfo);
width = devinfo.cxScreen;
height = devinfo.cyScreen;
}
|
|
別の例を挙げましょう。BREWで描画を行うためのインタフェースとして、"IDisplayインタフェース" が用意されています。このインタフェースは、線を描画したり、四角形を描画したり、描画する色を設定するための関数群を持ちます。
例えば、画面に赤い枠を表示するには、次のようにします。
static void Square_OnAppStart(AEEApplet* app)
{
IDisplay* disp;
AEERect rect;
RGBVAL red = MAKE_RGB(255, 0, 0);
// IDisplayオブジェクトを取得する。
disp = app->m_pIDisplay;
// 赤い四角形の枠を描画する
rect.x = 20;
rect.y = 20;
rect.dx = 40;
rect.dy = 30;
IDISPLAY_DrawRect(disp, &rect, red, 0, IDF_RECT_FRAME);
// 画面ビットマップへの描画を実際に表示する
IDISPLAY_Update(disp);
}
|
|
ここで MAKE_RGB(red, blue, green) は、赤青緑の三原色から色を表す数値(RGBVAL型)を作成するマクロです。BREWでは色をRGBVAL型で表現します。
また、AEERectは長方形を表す構造体で、次のような宣言になっています。
typedef struct
{
int16 x, y;
int16 dx, dy;
} AEERect;
|
|
BREWのインタフェースについて理解が深まったでしょうか。インタフェースといっても特に難しいことはなく、昔からC言語プログラマーがやってきたことに新しい名前を与えただけなのです。
[倉谷智尋, ITmedia]
Copyright © ITmedia, Inc. All Rights Reserved.
前のページ | 1/3 | 次のページ