OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6751|回复: 8

分享一个emWin软键盘控件

[复制链接]

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2016-6-3
在线时间
25 小时
发表于 2016-6-27 16:37:32 | 显示全部楼层 |阅读模式
花了两天时间做了个emWin软键盘控件,并命名为ButtonSKB控件:
image001.png

前言:
(1)ButtonSKB已经是1个控件,即可以像使用Button控件一样使用ButtonSKB。
(2)ButtonSKB是由Button控件修改而来(通过skinning方式),其实是在1个大的按键里面”绘制”出多个小按键(注意是”绘制”,而不是”创建”),即ButtonSKB实际上是1个按键,只是把这个按键的绘图函数改了,改成我们自己的绘图函数并绘制出多个小按键,为什么这么做?请继续看…
(3)我相信大家现在用软键盘的方法都是创建几十个Button控件组成一个键盘,这样带来两个问题:1.占用大量SRAM(50个Button将消耗8Kbytes内存),2.管理麻烦(比如移动、隐藏、禁用等等)
(4)既然ButtonSKB是1个Button控件,那么所有Button的APP函数都适用ButtonSKB;只是要修改里面的小按键的属性怎么办?只能通过修改上面所说的绘图函数。
(5)论坛高手那么多,谁能把ButtonSKB演变成中文输入法控件?但是不能占用太多SRAM,在此谢过!

ButtonSKB使用方法:
(1)用GUIbuilder创建一个WINDOW窗体并放置Button控件,然后另存为WindowDLG.c;当然你可以设计任何形式的软键盘,只是别忘了一定是WINDOW+Button组成:
image003.png

(2)复制WindowDLG.c下面的ID定义和控件结构体到SKIN_buttonSKB.c文件(代替原来的):
#define ID_WINDOW_0  (GUI_ID_USER + 0x00)
#define ID_BUTTON_0  (GUI_ID_USER + 0x02)
#define ID_BUTTON_1  (GUI_ID_USER + 0x03)
….
#define ID_BUTTON_18  (GUI_ID_USER + 0x14)
#define ID_BUTTON_19  (GUI_ID_USER + 0x15)

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 },
  { BUTTON_CreateIndirect, ",", ID_BUTTON_2, 43, 168, 31, 31, 0, 0x0, 0 },
  { 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 },
  { BUTTON_CreateIndirect, "=", ID_BUTTON_18, 43, 17, 31, 32, 0, 0x0, 0 },
  { BUTTON_CreateIndirect, "Del", ID_BUTTON_19, 6, 17, 31, 31, 0, 0x0, 0 },
};

(3)经过上面2个步骤,buttonSKB控件已经修改完成,怎么调用使用它?当然是把它当做一个Button按键控件来使用:
static const GUI_WIDGET_CREATE_INFO _aDialogCreateSKB[] = {
  { FRAMEWIN_CreateIndirect, "  neqee.com", ID_FRAMEWIN_0, 40, 25, 161, 232, FRAMEWIN_CF_MOVEABLE, 0 },
  { 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 },
};
其中” ID_BUTTON_8”就是这个软键盘控件。

(4)别忘了在WM_INIT_DIALOG消息中把这个Button控件的绘制函数改成自定义绘制函数,这样我们想把这个Button控件画成什么样都行,emWin已经不参与这个控件的绘制工作了:
hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_8);
BUTTON_SetSkin(hItem, SKIN_buttonSKB3C);
如果不做第4步工作会怎样?当然显示的是那个大按键的原貌:
image005.gif

(5)再重复一遍:论坛高手那么多,谁能把ButtonSKB演变成中文输入法控件?但是不能占用太多SRAM,在此谢过!

ButtonSKB控件效果演示(使用位图皮肤).rar (231.15 KB, 下载次数: 473)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
478
金钱
478
注册时间
2015-7-11
在线时间
145 小时
发表于 2016-6-28 08:50:51 | 显示全部楼层
点赞,研究下楼主的代码
回复 支持 反对

使用道具 举报

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-3-18
在线时间
25 小时
发表于 2016-6-28 09:11:14 | 显示全部楼层
//SKB 注意最后1个参数是2     请问楼主,最后一个参数的做什么用的?
回复 支持 反对

使用道具 举报

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2016-6-3
在线时间
25 小时
 楼主| 发表于 2016-6-30 01:52:57 来自手机 | 显示全部楼层
liudijiang 发表于 2016-6-28 09:11
//SKB 注意最后1个参数是2     请问楼主,最后一个参数的做什么用的?

开两个字节的用户储存区出来储存被按下的小按键的ID
回复 支持 反对

使用道具 举报

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2016-6-3
在线时间
25 小时
 楼主| 发表于 2016-7-1 12:50:49 | 显示全部楼层
修正了3个问题:
(1)之前版本忘记绘制背景了,现加上。
(2)去掉键盘当中的小按键的聚焦,因为小按键的聚焦只是绘图出来的效果,没有任何的功能性,没有任何的意义。
(3)增加整个软键盘的聚焦,即可以通过Tab键聚焦到整个大键盘上。

image006.gif
顺便说一下,这个ButtonSKB控件有个缺点就是任何1个小按键按下和弹起,所有的小按键都要重新绘制一遍,可能会影响刷屏速度,如果用GLCD并且加上位图皮肤的话就没什么影响;要想解决这个问题,只能按照emWin提供的方法新开发1个ButtonSKB控件,而不是通过Skinning方式修改而来,我正在做当中,做好之后再另外开个贴分享给大家…
新开发的ButtonSKB控件将加入新功能,软键盘当中的小按键能够聚焦,能够接受实体键盘的控制,比如通过实体键盘的Tab键聚焦到软键盘之后,可以通过实体键盘的上下左右移动软键盘小按键的聚焦点,然后按实体键盘的Enter键点击被聚焦的小按键。



ButtonSKB控件源代码(使用位图皮肤)_v105.rar (2.85 MB, 下载次数: 463)
回复 支持 反对

使用道具 举报

14

主题

76

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1422
金钱
1422
注册时间
2015-12-22
在线时间
325 小时
发表于 2016-7-12 23:08:16 | 显示全部楼层
glcd 发表于 2016-7-1 12:50
修正了3个问题:
(1)之前版本忘记绘制背景了,现加上。
(2)去掉键盘当中的小按键的聚焦,因为小按键的聚 ...

非常棒
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-5-18
在线时间
22 小时
发表于 2016-12-22 21:14:42 | 显示全部楼层
多多学习多多学习
回复 支持 反对

使用道具 举报

5

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-11-29
在线时间
24 小时
发表于 2016-12-23 16:36:24 | 显示全部楼层
下来学习学习
回复 支持 反对

使用道具 举报

18

主题

112

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
363
金钱
363
注册时间
2015-10-29
在线时间
49 小时
发表于 2016-12-27 15:29:33 | 显示全部楼层
厉害啊!学习学习,感谢分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 09:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表