本帖最后由 glcd 于 2016-6-27 16:54 编辑 ( x% h3 \" v" W! h 0 v: n9 a, z( d$ h- \ 花了两天时间做了个emWin软键盘控件,并命名为ButtonSKB控件: ! ?% M3 | f5 z" s0 }+ K 前言: (1)ButtonSKB已经是1个控件,即可以像使用Button控件一样使用ButtonSKB。9 c, L5 a; l- |# I) c' ` (2)ButtonSKB是由Button控件修改而来(通过skinning方式),其实是在1个大的按键里面”绘制”出多个小按键(注意是”绘制”,而不是”创建”),即ButtonSKB实际上是1个按键,只是把这个按键的绘图函数改了,改成我们自己的绘图函数并绘制出多个小按键,为什么这么做?请继续看…3 v& {/ h( o/ \" B. f (3)我相信大家现在用软键盘的方法都是创建几十个Button控件组成一个键盘,这样带来两个问题:1.占用大量SRAM(50个Button将消耗8Kbytes内存),2.管理麻烦(比如移动、隐藏、禁用等等) (4)既然ButtonSKB是1个Button控件,那么所有Button的APP函数都适用ButtonSKB;只是要修改里面的小按键的属性怎么办?只能通过修改上面所说的绘图函数。* s( {% X$ g r- n (5)论坛高手那么多,谁能把ButtonSKB演变成中文输入法控件?但是不能占用太多SRAM,在此谢过! - G5 _) U$ O. w$ N1 O ButtonSKB使用方法: u5 {: b5 D7 e4 w0 j
(1)用GUIbuilder创建一个WINDOW窗体并放置Button控件,然后另存为WindowDLG.c;当然你可以设计任何形式的软键盘,只是别忘了一定是WINDOW+Button组成: ! Z7 E: m; S$ A. g (2)复制WindowDLG.c下面的ID定义和控件结构体到SKIN_buttonSKB.c文件(代替原来的):# i3 y, @) j. H+ O7 k; a #define ID_WINDOW_0 (GUI_ID_USER + 0x00); x) W4 E# l1 C Z4 h. M #define ID_BUTTON_0 (GUI_ID_USER + 0x02)+ ]) Q% g# C. x! g- o$ q) c& H #define ID_BUTTON_1 (GUI_ID_USER + 0x03) …. #define ID_BUTTON_18 (GUI_ID_USER + 0x14) #define ID_BUTTON_19 (GUI_ID_USER + 0x15) / [$ z5 t- t8 U3 l) O! Y& [ static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = { { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 151, 207, 0, 0x0, 0 }, { BUTTON_CreateIndirect, "Ent", ID_BUTTON_0, 113, 168, 31, 31, 0, 0x0, 0 }, { BUTTON_CreateIndirect, ".", ID_BUTTON_1, 78, 168, 31, 31, 0, 0x0, 0 },' f- G% x5 v% f9 i- c- `# R q/ c { BUTTON_CreateIndirect, ",", ID_BUTTON_2, 43, 168, 31, 31, 0, 0x0, 0 },; m& U; p2 `, P { BUTTON_CreateIndirect, "0", ID_BUTTON_3, 7, 168, 31, 31, 0, 0x0, 0 }, …. { BUTTON_CreateIndirect, "/", ID_BUTTON_17, 78, 17, 31, 31, 0, 0x0, 0 },0 ]8 W n$ e, x6 q- [" u* y. k { BUTTON_CreateIndirect, "=", ID_BUTTON_18, 43, 17, 31, 32, 0, 0x0, 0 },) [" t3 r( ?$ D/ I% U9 C { BUTTON_CreateIndirect, "Del", ID_BUTTON_19, 6, 17, 31, 31, 0, 0x0, 0 }, };/ C: D8 q5 {% m+ T1 ] (3)经过上面2个步骤,buttonSKB控件已经修改完成,怎么调用使用它?当然是把它当做一个Button按键控件来使用:5 d/ D. a) q( V5 i+ Z$ { static const GUI_WIDGET_CREATE_INFO _aDialogCreateSKB[] = { { FRAMEWIN_CreateIndirect, " neqee.com", ID_FRAMEWIN_0, 40, 25, 161, 232, FRAMEWIN_CF_MOVEABLE, 0 },5 R7 w! U4 @0 ?3 |3 l { BUTTON_CreateIndirect, "", ID_BUTTON_8, 0, 0, 151, 207, 0, 0x0, 2 },//SKB 注意最后1个参数是2 { EDIT_CreateIndirect, "Edit", ID_EDIT_0, 120, 1, 23, 13, 0, 0x64, 0 },3 J+ `: ?9 R- {8 y, I5 U6 L }; 其中” ID_BUTTON_8”就是这个软键盘控件。 % j% B/ M/ z9 U) x! B; @
(4)别忘了在WM_INIT_DIALOG消息中把这个Button控件的绘制函数改成自定义绘制函数,这样我们想把这个Button控件画成什么样都行,emWin已经不参与这个控件的绘制工作了: hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_8);5 p3 @: T: { u6 X) J4 X5 ]: l BUTTON_SetSkin(hItem, SKIN_buttonSKB3C);* |0 n! ~ e S! v7 U 如果不做第4步工作会怎样?当然显示的是那个大按键的原貌: ( |" K3 M: |1 |1 q5 | , o2 i: W7 O. \# p (5)再重复一遍:论坛高手那么多,谁能把ButtonSKB演变成中文输入法控件?但是不能占用太多SRAM,在此谢过!0 j% d( Q" [6 V3 i( b9 k - }- t; B) [, d* z3 Z. u" i$ a |
(1)之前版本忘记绘制背景了,现加上。, W# f/ q! M2 f/ d3 G$ R8 Q( N2 g
(2)去掉键盘当中的小按键的聚焦,因为小按键的聚焦只是绘图出来的效果,没有任何的功能性,没有任何的意义。
(3)增加整个软键盘的聚焦,即可以通过Tab键聚焦到整个大键盘上。( B# ?, ~' z. ]( F' I
# _$ n c/ A' h) _5 F
顺便说一下,这个ButtonSKB控件有个缺点就是任何1个小按键按下和弹起,所有的小按键都要重新绘制一遍,可能会影响刷屏速度,如果用GLCD并且加上位图皮肤的话就没什么影响;要想解决这个问题,只能按照emWin提供的方法新开发1个ButtonSKB控件,而不是通过Skinning方式修改而来,我正在做当中,做好之后再另外开个贴分享给大家…" c, ^% a( U( Z( Q0 v& W. Z
新开发的ButtonSKB控件将加入新功能,软键盘当中的小按键能够聚焦,能够接受实体键盘的控制,比如通过实体键盘的Tab键聚焦到软键盘之后,可以通过实体键盘的上下左右移动软键盘小按键的聚焦点,然后按实体键盘的Enter键点击被聚焦的小按键。
6 ~* t4 v* L. t/ }
非常感谢
是的,有函数