入力フィールドを作成するために必要な作業は、入力フィールドのためのメニューアイテムを定義することだけです。
 あとは基本的な使い方と同じコードで、AM_MenuExec関数が文字の入力や編集の処理をすべて実行します。
  1. 入力フィールドのための入力バッファを定義します。
    入力フィールドに表示される文字列は常にこのバッファに格納されています。 入力フィールドに表示する初期値はこのバッファから読み出します。文字を入力した結果も、このバッファに書き込みます。
    サンプル
    static char UID_EditBuf[8+1] = {""};
    

  2. AM_EditParam構造体で入力フィールドの制御に必要な情報を定義します。
    次の情報を設定します。
    • 最大文字数
    • カーソルを表示する場合は、カーソルの表示色
    • 英字モードを使用する場合は、候補文字の表示色
    • 入力操作の詳細を指定するオプションフラグ
    • 前述の入力バッファを指すポインタ
    • 前述の入力バッファの長さ
    • その他
    サンプル
    static const AM_EditParam EditParamUID = {
        8,                  // MaxDigits
        RGB_WHITE,          // Cursor foregraund Color
        RGB_BLUE,           // Cursor backgraund Color
        RGB_WHITE,          // Shift mode foregraund Color
        RGB_BLUE,           // Shift mode backgraund Color
        AM_EDIT_NUMERIC|AM_EDIT_UNDERLINE|AM_EDIT_CLEAR_ON_FIRST_CHAR|AM_EDIT_NO_CURSOR,    // EditOption
        NULL,               // alphaCandidateTable
        UID_EditBuf,        // Value
        sizeof(UID_EditBuf) // ValueBufSize
    };
    

  3. 入力フィールドのためのメニューアイテムでは、AM_MenuItem構造体のshowControlAM_TEXT_EDITを設定し、 menuTextに上記のAM_EditParam構造体を指すポインタを指定します。
    サンプル
    static const AM_MenuItem SettingtMenuTable[] = {
    //   itemID,     y, x, menuText,              Palette, visible, enabled, selectable, showControl
        ...
    
        {SET_ID_UID, 6, 9, (void *)&EditParamUID, PX_EDIT, true,    true,    true,       AM_TEXT_EDIT},
    
        ...
    };
    

  4. あとは基本的な使い方と同様に、 AM_CreateMenu関数でメニューリソースを生成し、 AM_ShowMenu関数で画面を表示し、 AM_ExecMenu関数でキー入力を待機してイベントを処理します。

さらに...

  • AM_CreateMenu関数でメニューリソースを生成したあとであれば、 AM_GetText関数AM_SetText関数を使用して、入力フィールドのために定義した入力バッファの内容を読み書きできます。
  • 上記のサンプルでは、AM_EditParam構造体EditOptionにAM_EDIT_NUMERICを指定して数字入力のための入力フィールドにしていますが、 英字や記号を入力する場合は、AM_EDIT_NUMERICを外します。詳しくはAM_EditParam構造体EditOptionの説明を参照してください。
  • 英字や記号を入力する場合は、[SHIFT]キーを押して入力モードを切り替える操作を行いますが、AM_MenuItem構造体のshowControlにAM_SHIFT_MODEやAM_SHIFT_CANDIDATEを指定することにより、 画面上に現在のシフトモードや候補文字を表示することができます。コーディング例は、サンプルプログラムのedit_name関数を参照してください。
 

サンプル

数字入力のサンプル

  ...

// Text field parameter
static char UID_EditBuf[8+1] = {""};
static const AM_EditParam EditParamUID = {
    8,                  // MaxDigits
    RGB_WHITE,          // Cursor foregraund Color
    RGB_BLUE,           // Cursor backgraund Color
    RGB_WHITE,          // Shift mode foregraund Color
    RGB_BLUE,           // Shift mode backgraund Color
    AM_EDIT_NUMERIC|AM_EDIT_UNDERLINE|AM_EDIT_CLEAR_ON_FIRST_CHAR|AM_EDIT_NO_CURSOR,    // EditOption
    NULL,               // alphaCandidateTable
    UID_EditBuf,        // Value
    sizeof(UID_EditBuf) // ValueBufSize
};

// Item ID
enum _SETTING_ITEM_ID {
    SET_ID_UID = 1,
    SET_ID_APPLY,
};

// Table of the menu items for the setting screen
static const AM_MenuItem SettingtMenuTable[] = {
//   itemID,       y,           x,          menuText,                 Palette,          visible, enabled, selectable, showControl
    {0,            0,           0,          "      Settings        ", PX_TITLE_SETTING, true,    true,    false,      AM_NO_CONTROL},
    {0,            6,           1,          "UserID:",                PX_BASE,          true,    true,    false,      AM_NO_CONTROL},
    {SET_ID_UID,   6,           9,          (void *)&EditParamUID,    PX_EDIT,          true,    true,    true,       AM_TEXT_EDIT},
    {0,            AM_PIX(129), 0,          "Cancel",                 PX_GUIDE,         true,    true,    false,      AM_CLEAR_ICON},
    {SET_ID_APPLY, AM_PIX(129), AM_PIX(64), "Apply",                  PX_APPLY,         true,    true,    false,      AM_ENT_ICON},
    {-1}
};

void settings(MENU_HANDLE hMain)
{
    MENU_HANDLE hMenu;
    int event;
    bool exit = false;

    hMenu = AM_CreateMenu(SettingtMenuTable, (const pAM_Option)&SettingOption);

    while(1){
        AM_ShowMenu(hMenu, AM_SELECT_ANY_ID);

        while(1){
            event = AM_ExecMenu(hMenu);
            if (event == CLR_KEY){
                exit = true;
                break;
            }else if (event == ENT_KEY){
                // Input string is stored in UID_EditBuf.
                  ...

                exit = true;
                break;
            }
        }
        if (exit){
            break;
        }
    }

    AM_ReleaseMenu(hMenu);
    return;
}

英字入力のサンプル

  ...

void edit_name(char *namebuf, int length)
{
    /////////////////////////////////////////
    // Local definition of the menu items
    /////////////////////////////////////////
    static char name_EditBuf[20+1] = {""};
    static const AM_EditParam EditParamName = {
        20,                  // MaxDigits
        RGB_WHITE,           // Cursor foregraund Color
        RGB_BLUE,            // Cursor backgraund Color
        RGB_WHITE,           // Shift mode foregraund Color
        RGB_BLUE,            // Shift mode backgraund Color
        AM_EDIT_SET_ALPHA | AM_EDIT_MOVE_CURSOR_BY_Q1Q2,    // EditOption
        NULL,                // alphaCandidateTable
        name_EditBuf,        // Value
        sizeof(name_EditBuf) // ValueBufSize
    };

    // Item ID
    enum _SETTING_NAME_ITEM_ID {
        SET_ID_ENAME = 1,
        SET_ID_EAPPLY,
    };

    // Table of the menu items for the name screen
    static const AM_MenuItem SettingtNameTable[] = {
    //   itemID,       y,           x,          menuText,                Palette,          visible, enabled, selectable, showControl
        {0,            0,           0,          "        Name         ", PX_TITLE_SETTING, true,    true,    false,      AM_NO_CONTROL},
        {0,            2,           1,          "Name:",                 PX_BASE,          true,    true,    false,      AM_NO_CONTROL},
        {SET_ID_ENAME, 3,           1,          (void *)&EditParamName,  PX_EDIT,          true,    true,    true,       AM_TEXT_EDIT},
        {0,            5,           1,          "",                      PX_GUIDE,         true,    true,    false,      AM_SHIFT_MODE},
        {0,            5,           7,          "",                      PX_GUIDE,         true,    true,    false,      AM_SHIFT_CANDIDATE},
        {0,            AM_PIX(129), 0,          "Cancel",                PX_GUIDE,         true,    true,    false,      AM_CLEAR_ICON},
        {SET_ID_EAPPLY,AM_PIX(129), AM_PIX(64), "Apply",                 PX_APPLY,         true,    true,    false,      AM_ENT_ICON},
        {-1}
    };
    /////////////////////////////////////////

    MENU_HANDLE hMenu;
    int event;

    strncpy(name_EditBuf, namebuf, sizeof(name_EditBuf)-1);

    hMenu = AM_CreateMenu(SettingtNameTable, (const pAM_Option)&SettingOption);

    AM_ShowMenu(hMenu, AM_SELECT_ANY_ID);

    while(1){
        event = AM_ExecMenu(hMenu);
        if (event == CLR_KEY){
            break;
        }else if (event == ENT_KEY){
            memset(namebuf, 0, length);
            strncpy(namebuf, name_EditBuf, length - 1);
            break;
        }
    }
    AM_ReleaseMenu(hMenu);
    return;
}

関連事項

最終更新日:2020/10/08