BREW のテキストコントロール - 1 / 2 -
ITextCtl
ITextCtl インターフェースはテキスト入力のための BREW 標準の GUI コントロールのひとつです。
※ 以下で、"テキストコントロール" は "ITextCtl インターフェース " と同義です。
アプリの概要

- 最初に、"Push Select Key" を表示します。

- セレクトキーが押されると、テキスト入力画面に移ります。

- テキストが変更され、セレクトキーが押されます。

- テキスト入力が終了すると元の画面に戻り、変更された文字列を表示します。
準備
アプレット構造体には、ITextCtl インターフェース( テキストコントロール ) のインスタンス変数を追加します。
■ アプレット構造体の宣言
typedef struct TextCtlApp {
AEEApplet a; // アプレット構造体の先頭メンバは必ず AEEApplet 型にすること。
Common common; // 画面表示用
ITextCtl* textctl; // ITextCtl インターフェースのインスタンス変数
AEERect rect;
} TextCtlApp;
※ その他 : " AEEText.h " ヘッダーファイルのインクルードが必要です。
テキストコントロールの初期化
ISHELL_CreateInstance 関数を使って、クラス ID AEECLSID_TEXTCTL でテキストコントロールのインスタンスを生成します。
以下のように、最大入力文字数、位置とサイズ、タイトル、文字列、プロパティを設定します。
// テキストコントロール生成
static void MakeTextCtl(TextCtlApp* app)
{
AECHAR* wstr_text;
int astr_text_len;
int wstr_text_bytes;
char string[] = "テキスト入力";
app->textctl = NULL;
ISHELL_CreateInstance(app->a.m_pIShell, AEECLSID_TEXTCTL,
(void**)&app->textctl);
// 文字列最大長設定
ITEXTCTL_SetMaxSize(app->textctl, TEXT_SIZE);
// 描画域指定
ITEXTCTL_SetRect(app->textctl, &app->rect);
// タイトル設定 (char から AECHARへ変換)
astr_text_len = STRLEN(string);
wstr_text_bytes = (astr_text_len + 1) * sizeof(AECHAR);
wstr_text = (AECHAR*) MALLOC(wstr_text_bytes);
STREXPAND((byte*)string, astr_text_len, wstr_text, wstr_text_bytes);
ITEXTCTL_SetTitle(app->textctl, NULL, 0, wstr_text);
FREE(wstr_text);
// コントロール内文字列設定
ITEXTCTL_SetText(app->textctl, app->common.message, -1);
// プロパティ設定(複数行制御, フレーム設定, 正確な高さ設定)
ITEXTCTL_SetProperties(app->textctl, TP_MULTILINE | TP_FRAME | TP_FIXSETRECT);
// アクティブ設定
ITEXTCTL_SetActive(app->textctl, TRUE);
return;
}
これでテキストコントロールの描画や文字列が取得できるようになりました。
" Active " の意味
"Active"とは GUI におけるコンポーネントのフォーカスのことです。
BREW では、メニューやテキスト、日付、時間など複数のコントロールを画面に配置できます。
どのコントロールがキーイベントを処理するかは、コントロールが "Active" に設定されているかどうかで決まります。
テキストコントロールは ITEXTCTL_SetActive 関数を使って "Active" 又は "False" ( 非 "Active" ) に設定します。
ITEXTCTL_SetActive(app->textctl,TRUE);
これによってテキストコントロール app->textctl はフォーカスされ、キーイベントはこのコントロールに通知されます。テキストコントロールが "Active" であるかどうかは ITEXTCTL_IsActive 関数を呼び出して判定します。
※ BREW では、複数のコントロールが "Active" になり得る前提でプログラミングする必要があります。実際には、コントロールが複数あっても、排他的に "Active" になるようにプログラミングするのが良いでしょう。
テキストコントロールのイベントハンドリング
TextCtlApp_HandleEvent 関数で
else if( app->textctl != NULL &&
ITEXTCTL_HandleEvent(app->textctl, eCode, wParam, dwParam) ){
return TRUE;
と記述することで、テキストコントロールのインスタンスが生成されていて "Active" であれば、キーイベントはテキストコントロールに送られ、ITEXTCTL_HandleEvent 関数で処理されます。
static boolean TextCtlApp_HandleEvent(TextCtlApp* app,
AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
if (eCode == EVT_APP_START) {
return OnAppStart(app);
}
else if (app->textctl != NULL &&
ITEXTCTL_HandleEvent(app->textctl, eCode, wParam, dwParam)) {
return TRUE;
}
else {
switch (eCode) {
case EVT_APP_STOP:
return OnAppStop(app);
case EVT_KEY:
return OnKey(app, wParam);
case EVT_CTL_TAB:
return OnCtlTab(app, dwParam);
}
}
return FALSE;
}
注意事項
テキストコントロールの動作はエミュレーターと携帯電話実機では異なります。

















