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; }
注意事項
テキストコントロールの動作はエミュレーターと携帯電話実機では異なります。