ホーム > デベロッパ > BREW プログラミング入門 > BREW のテキストコントロール > - 1 / 2 -

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;
}

注意事項

テキストコントロールの動作はエミュレーターと携帯電話実機では異なります。