-
画面で使用する色の組み合わせをカラーパレット(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
- 画面内で共通な事項に関するオプションを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 };
- メニューアイテム(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} };
- 前項までで定義した情報をAM_CreateMenu関数に渡してメニューリソースを生成し、メニューハンドルを取得します。
サンプル
MENU_HANDLE hMenu; ... hMenu = AM_CreateMenu(MainMenuTable, (const pAM_Option)&MenuOption);
- メニューハンドルをAM_ShowMenu関数に渡して画面を表示させます。
サンプル
AM_ShowMenu(hMenu, AM_SELECT_ANY_ID);
これまでのサンプルコードで下図のような画面を表示できます。
- メニューアイテムで定義したアイテムIDを指定して、メニューアイテムを動的に変更できます。
次の関数を使用できます。
-
AM_ExecMenu関数でキー入力を待機し、イベントを処理します。
AM_ExecMenu関数は次の機能を提供します。- フォーカスがあるメニューアイテムにハイライトを表示する。
- [Q1]キー、[Q2]キーでフォーカスを前後に移動する。
- チェックボックスがあるメニューアイテムにフォーカスがあるときは、[SCAN]キーでチェックボックスのオン、オフを切り替える。
- ラジオボタンがあるメニューアイテムにフォーカスがあるときは、[SCAN]キーでラジオボタンをオンにする。
- 入力フィールドにフォーカスがあるときは文字入力の編集制御を行う。
- バーコードリーダが有効のときは、[SCAN]キーでバーコードの読み取りを行う。
- 何らかの入力があればイベントを返す。
- 入力が無い場合はIdle関数を呼びながら入力を待機する。
サンプル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; } }
- 画面を閉じるときは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