AdvancedMenuライブラリで画面に表示するアイテムを定義し、これを画面に表示して、キー入力を待機し処理を行うまでの基本的な流れを説明します。

  1. 画面で使用する色の組み合わせをカラーパレット(AM_ColorPalette構造体)の配列で定義します。
    カラーパレットの情報:
    • 文字色と背景色
    • フォーカスがあるときの文字色と背景色
    • アイコンなどの表示色
    色を指定するときはパレットインデックス(この配列のインデックス値)で指定します。

    次のサンプルでは8個のカラーパレットを定義しています。分かりやすいように、パレットインデックスのマクロも定義しておきます。
    サンプル
    #define MENU_FORE_COLOR     RGB_WHITE
    #define MENU_BACK_COLOR     0x427cbe    //Dull blue
    #define MENU_BUTTON_COLOR   RGB_YELLOW
    #define MENU_APPLY_COLOR    0xfcd9ff    //Color of Start icon (Light pink)
    #define MENU_SELECT_COLOR   0x284a70    //Dark blue
    
    #define FORE_COLOR          RGB_WHITTE
    #define BACK_COLOR          0xf7f7f7    //Light gray
    #define SELECT_COLOR        RGB_BLUE
    #define DISABLE_COLOR       0xb0b0b0    //Gray
    #define GIUDE_BUTTON        RGB_BLUE
    #define APPLY_COLOR         RGB_MAGENTA
    #define TITLE_SET_COLOR     RGB_BLUE
    #define TITLE_TASK_COLOR    0x008000    //Dark Green
    
    static const AM_ColorPalette CustomColor[] = {
        //ForeColor,        BackColor,        Select_ForeColor, Select_BackColor,  Control_ForeColor
        { MENU_FORE_COLOR,  MENU_BACK_COLOR,  RGB_WHITE,        MENU_SELECT_COLOR, MENU_BUTTON_COLOR }, //#0: Task menu base color
        { MENU_FORE_COLOR,  MENU_BACK_COLOR,  0,                0,                 MENU_APPLY_COLOR  }, //#1: Task menu apply color
        { RGB_BLACK,        BACK_COLOR,       RGB_WHITE,        SELECT_COLOR,      GIUDE_BUTTON      }, //#2: Base color
        { RGB_WHITE,        RGB_BLUE,         0,                0,                 0                 }, //#3: Title of Setting
        { GIUDE_BUTTON,     BACK_COLOR,       0,                0,                 GIUDE_BUTTON      }, //#4: Guide color
        { RGB_WHITE,        TITLE_TASK_COLOR, 0,                0,                 0                 }, //#5: Title 0f tasks
        { RGB_BLACK,        RGB_WHITE,        RGB_BLACK,        RGB_YELLOW,        RGB_BLUE          }, //#6: Input field color
        { APPLY_COLOR,      BACK_COLOR,       0,                0,                 APPLY_COLOR       }, //#7: Apply color
    };
    #define PX_MENU           0  // Task menu base color
    #define PX_MENU_APPLY     1  // Task menu apply color
    #define PX_BASE           2  // Base color
    #define PX_TITLE_SETTING  3  // Title of Setting
    #define PX_GUIDE          4  // Guide color
    #define PX_TITLE_TASK     5  // Title 0f tasks
    #define PX_EDIT           6  // Input field color
    #define PX_APPLY          7  // Apply color
    
    

  2. 画面内で共通な事項に関するオプションをAM_Option構造体で定義します。
    オプションの情報:
    • デフォルトの文字色と背景色
    • 無効状態のアイテムの表示色
    • カラーパレットの配列への参照
    • デフォルトのフォント
    • デフォルトの行間隔
    • その他のオプション
    サンプル
    static const AM_Option MenuOption = {
        MENU_FORE_COLOR,                                // MenuForeColor
        DISABLE_COLOR,                                  // MenuDisabledForeColor
        MENU_BACK_COLOR,                                // MenuBackColor
        sizeof(CustomColor)/sizeof(AM_ColorPalette),      // NumberOfColorPalette
        (pAM_ColorPalette)CustomColor,                  // ColorPalettes
        0,                                              // OptionFlag
        HUGE_FONT,                                      // DefaultFont
        1                                               // DefaultLineSpacing
    };
    
    

  3. メニューアイテムAM_MenuItem構造体)の配列で一画面分の表示内容を定義します。
    メニューアイテムの情報:
    • アイテムID:このアイテムを指定するために使用するID
    • 座標(行・列、またはピクセル座標)
    • 表示する文字列
    • パレットインデックス
    • visible属性:表示を行うかどうかの指定
    • enabled属性:有効にするかどうかの指定。
    • selectable属性:フォーカスも持てるかどうかの指定。
    • チェックボックスやラジオボタンの指定
    • アイコンの指定
    • 入力フィールドの場合、バッファや入力操作を指定する情報(AM_EditParam構造体
    • 画像を表示する場合、BMPファイル名
    • フォントの種類
    • その他

    次のサンプルでは6個のメニューアイテムを定義しています。
    サンプル
    // Item ID
    enum _MAIN_ITEM_ID {
        MENU_ID_TASK1 = 1,
        MENU_ID_TASK2,
        MENU_ID_TASK3,
        MENU_ID_NOTASK,
        MENU_ID_START,
    };
    // Table of the menu items for the task menu screen
    static const AM_MenuItem MainMenuTable[] = {
    //   itemID,        y,           x, menuText,     Palette,       visible, enabled, selectable, showControl,   checked, font
        {MENU_ID_TASK1, 1,           1, " Task #1 ",  PX_MENU,       true,    true,    true,       AM_NO_CONTROL},
        {MENU_ID_TASK2, 2,           1, " Task #2 ",  PX_MENU,       true,    true,    true,       AM_NO_CONTROL},
        {MENU_ID_TASK3, 3,           1, " Task #3 ",  PX_MENU,       true,    true,    true,       AM_NO_CONTROL},
        {MENU_ID_NOTASK,1,           1, "No task",    PX_MENU,       false,   true,    false,      AM_NO_CONTROL},
        {0,             AM_PIX(114), 0, "Settings",   PX_MENU,       true,    true,    false,      AM_F1_ICON,    false,   MEDIUM_FONT},
        {MENU_ID_START, AM_PIX(129), 0, "Start task", PX_MENU_APPLY, true,    true,    false,      AM_SCAN_ICON,  false,   MEDIUM_FONT},
        {-1}
    };
    
    

  4. 前項までで定義した情報をAM_CreateMenu関数に渡してメニューリソースを生成し、メニューハンドルを取得します。
    サンプル
        MENU_HANDLE hMenu;
        ...
        hMenu = AM_CreateMenu(MainMenuTable, (const pAM_Option)&MenuOption);
    

  5. メニューハンドルAM_ShowMenu関数に渡して画面を表示させます。
    サンプル
        AM_ShowMenu(hMenu, AM_SELECT_ANY_ID);    
    

    これまでのサンプルコードで下図のような画面を表示できます。
  6. メニューアイテムで定義したアイテムIDを指定して、メニューアイテムを動的に変更できます。
    次の関数を使用できます。

  7. AM_ExecMenu関数でキー入力を待機し、イベントを処理します。
    AM_ExecMenu関数は次の機能を提供します。
    • フォーカスがあるメニューアイテムにハイライトを表示する。
    • [Q1]キー、[Q2]キーでフォーカスを前後に移動する。
    • チェックボックスがあるメニューアイテムにフォーカスがあるときは、[SCAN]キーでチェックボックスのオン、オフを切り替える。
    • ラジオボタンがあるメニューアイテムにフォーカスがあるときは、[SCAN]キーでラジオボタンをオンにする。
    • 入力フィールドにフォーカスがあるときは文字入力の編集制御を行う。
    • バーコードリーダが有効のときは、[SCAN]キーでバーコードの読み取りを行う。
    • 何らかの入力があればイベントを返す。
    • 入力が無い場合はIdle関数を呼びながら入力を待機する。
    次のサンプルでは、[SCAN]キーが押されたときは、 AM_GetSelectedLine関数でフォーカスがあるメニューアイテムのアイテムIDを取得して処理を分岐しています。
    サンプル
    while(1){
      event = AM_ExecMenu(hMenu);
      if (event == F1_KEY){
          ...
          break;
      }else if (event == SCAN_KEY){
          task = AM_GetSelectedLine(hMenu);
          switch (task){
          case MENU_ID_TASK1:
              ...
              break;
          case MENU_ID_TASK2:
              ...
              break;
          case MENU_ID_TASK3:
              ...
              break;
          default:
              continue;
          }
          break;
      }
    }
    
    

  8. 画面を閉じるときはAM_ReleaseMenu関数メニューハンドルを渡してメニューリソースを解放します。
    ユーザアプリケーションのmain関数は終了できないため、main関数のための画面のメニューリソースを解放することはできませんが、 サブ画面のためにAM_CreateMenu関数を呼び出してメニューリソースを生成した場合は、忘れずにメニューリソースを解放してください。
    サンプル
        AM_ReleaseMenu(hMenu);
    

サンプル

///////////////////////////////////////////////////////////////////
// Color palettes
///////////////////////////////////////////////////////////////////
#define MENU_FORE_COLOR     RGB_WHITE
#define MENU_BACK_COLOR     0x427cbe    //Dull blue
#define MENU_BUTTON_COLOR   RGB_YELLOW
#define MENU_APPLY_COLOR    0xfcd9ff    //Color of Start icon (Light pink)
#define MENU_SELECT_COLOR   0x284a70    //Dark blue

#define FORE_COLOR          RGB_WHITTE
#define BACK_COLOR          0xf7f7f7    //Light gray
#define SELECT_COLOR        RGB_BLUE
#define DISABLE_COLOR       0xb0b0b0    //Gray
#define GIUDE_BUTTON        RGB_BLUE
#define APPLY_COLOR         RGB_MAGENTA
#define TITLE_SET_COLOR     RGB_BLUE
#define TITLE_TASK_COLOR    0x008000    //Dark Green

static const AM_ColorPalette CustomColor[] = {
    //ForeColor,        BackColor,        Select_ForeColor, Select_BackColor,  Control_ForeColor
    { MENU_FORE_COLOR,  MENU_BACK_COLOR,  RGB_WHITE,        MENU_SELECT_COLOR, MENU_BUTTON_COLOR }, //#0: Task menu base color
    { MENU_FORE_COLOR,  MENU_BACK_COLOR,  0,                0,                 MENU_APPLY_COLOR  }, //#1: Task menu apply color
    { RGB_BLACK,        BACK_COLOR,       RGB_WHITE,        SELECT_COLOR,      GIUDE_BUTTON      }, //#2: Base color
    { RGB_WHITE,        RGB_BLUE,         0,                0,                 0                 }, //#3: Title of Setting
    { GIUDE_BUTTON,     BACK_COLOR,       0,                0,                 GIUDE_BUTTON      }, //#4: Guide color
    { RGB_WHITE,        TITLE_TASK_COLOR, 0,                0,                 0                 }, //#5: Title 0f tasks
    { RGB_BLACK,        RGB_WHITE,        RGB_BLACK,        RGB_YELLOW,        RGB_BLUE          }, //#6: Input field color
    { APPLY_COLOR,      BACK_COLOR,       0,                0,                 APPLY_COLOR       }, //#7: Apply color
};
#define PX_MENU           0  // Task menu base color
#define PX_MENU_APPLY     1  // Task menu apply color
#define PX_BASE           2  // Base color
#define PX_TITLE_SETTING  3  // Title of Setting
#define PX_GUIDE          4  // Guide color
#define PX_TITLE_TASK     5  // Title 0f tasks
#define PX_EDIT           6  // Input field color
#define PX_APPLY          7  // Apply color

///////////////////////////////////////////////////////////////////
// Task menu screen
///////////////////////////////////////////////////////////////////

// Options for the task menu screen
static const AM_Option MenuOption = {
    MENU_FORE_COLOR,                                // MenuForeColor
    DISABLE_COLOR,                                  // MenuDisabledForeColor
    MENU_BACK_COLOR,                                // MenuBackColor
    sizeof(CustomColor)/sizeof(AM_ColorPalette),      // NumberOfColorPalette
    (pAM_ColorPalette)CustomColor,                  // ColorPalettes
    0,                                              // OptionFlag
    HUGE_FONT,                                      // DefaultFont
    1                                               // DefaultLineSpacing
};

// Definition of the task menu screen
// Item ID
enum _MAIN_ITEM_ID {
    MENU_ID_TASK1 = 1,
    MENU_ID_TASK2,
    MENU_ID_TASK3,
    MENU_ID_START,
};
// Table of the menu items for the task menu screen
static const AM_MenuItem MainMenuTable[] = {
//   itemID,        y,           x, menuText,     Palette,       visible, enabled, selectable, showControl,   checked, font
    {MENU_ID_TASK1, 1,           1, " Task #1 ",  PX_MENU,       true,    true,    true,       AM_NO_CONTROL},
    {MENU_ID_TASK2, 2,           1, " Task #2 ",  PX_MENU,       true,    true,    true,       AM_NO_CONTROL},
    {MENU_ID_TASK3, 3,           1, " Task #3 ",  PX_MENU,       true,    true,    true,       AM_NO_CONTROL},
    {0,             AM_PIX(114), 0, "Settings",   PX_MENU,       true,    true,    false,      AM_F1_ICON,    false,   MEDIUM_FONT},
    {MENU_ID_START, AM_PIX(129), 0, "Start task", PX_MENU_APPLY, true,    true,    false,      AM_SCAN_ICON,  false,   MEDIUM_FONT},
    {-1}
};

void main(void)
{
    MENU_HANDLE hMenu;
    int event;
    int task;

    hMenu = AM_CreateMenu(MainMenuTable, (const pAM_Option)&MenuOption);

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

        while(1){
            event = AM_ExecMenu(hMenu);
            if (event == F1_KEY){
                // Open setting screen
                ...

                break;
            }else if (event == SCAN_KEY){
                // Open screen of selected task.
                task = AM_GetSelectedLine(hMenu);
                switch (task){
                case MENU_ID_TASK1:
                    // Task1
                    ...

                    break;
                case MENU_ID_TASK2:
                    // Task2
                    ...

                    break;
                case MENU_ID_TASK3:
                    // Task3
                    ...

                    break;
                default:
                    continue;
                }
                break;
            }
        }
    }
}


関連事項

最終更新日:2020/10/17