emWin V6.46提供了自带的键盘控件,用起来功能还是比较齐全的。但是有些时候自带的布局不能满足要求,此时可用键盘的结构体来自定义布局。
KEYDEF_KEYBOARD MyNumPad;static KEYDEF_AREA NumPadKeyArea[4] =
{{10, 0, 720, 250}, //每行按钮的坐标和占用区域 多个按键平均分配宽度{10, 250, 720, 250}, //所有坐标值均以1000为参考值,和分辨率无关{10, 500, 720, 250},{10, 750, 480, 250},
};
static KEYBOARD_CODES NumPadKeyCode[4] = //各行的按钮数量和按钮对应字符
{{3, (u16 *)"\x31\x00\x32\x00\x33\x00"}, // '1' '2' '3' {3, (u16 *)"\x34\x00\x35\x00\x36\x00"}, // '4' '5' '6'{3, (u16 *)"\x37\x00\x38\x00\x39\x00"}, // '7' '8' '9'{2, (u16 *)"\x2E\x00\x30\x00"}, // '.' '0'
};static KEYDEF_LINE NumPadKeyDef[4];
static KEYDEF_LINE *pNumPadKey[4];// 以上是用行列的方式定义按钮,每个按钮对应显示1个字符,即按下后的输入内容//以下是独立按键,是用button方式实现的,可以显示字符串,结构体中有5个独立按键,可单独定义坐标、大小和按下后的输入内容
static KEYDEF_KEY NumPadKeyEnter = {{750, 750, 250, 250}, GUI_KEY_ENTER, {"确定"}}; //确定键
static KEYDEF_KEY NumPadKeyEsc = {{750, 500, 250, 250}, GUI_KEY_ESCAPE, {"取消"}}; //取消键
static KEYDEF_KEY NumPadKeyBksp = {{490, 750, 240, 250}, GUI_KEY_BACKSPACE, {"删除"}}; //删除键void NumPadLayoutInit(void)
{u8 i = 0;for(i=0; i<4; i++) // 共4行,每行3个按钮{NumPadKeyDef[i].Area = NumPadKeyArea[i];NumPadKeyDef[i].Codes = NumPadKeyCode[i];pNumPadKey[i] = &NumPadKeyDef[i];}MyNumPad.pDefEnter = &NumPadKeyEnter; //单独定义按键和位置MyNumPad.pDefSpace = &NumPadKeyEsc;MyNumPad.pDefBackspace = &NumPadKeyBksp;MyNumPad.NumFixedLines = 4; //指定按钮阵列MyNumPad.ppLineFixed = pNumPadKey;
}调用:NumPadLayoutInit();hWin = WM_GetDialogItem(pMsg->hWin, GUI_ID_KEYBOARD0);KEYBOARD_SetLayout(hWin, &MyNumPad);
注意,如果编译不通过,需要手动更改KEYBOARD结构体的定义,删除const,使指针能够使用非静态变量。
具体显示效果如下: