硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5341|回复: 5
收起左侧

[emWin] 分享一个emWin软键盘控件

[复制链接]

4

主题

21

回帖

33

积分

新手上路

积分
33
发表于 2016-6-27 15:56:26 | 显示全部楼层 |阅读模式
花了两天时间做了个emWin软键盘控件,并命名为ButtonSKB控件:
image001.png

前言:

(1)ButtonSKB已经是1个控件,即可以像使用Button控件一样使用ButtonSKB
(2)ButtonSKB是由Button控件修改而来(通过skinning方式),其实是在1个大的按键里面绘制出多个小按键(注意是绘制,而不是创建”),即ButtonSKB实际上是1个按键,只是把这个按键的绘图函数改了,改成我们自己的绘图函数并绘制出多个小按键,为什么这么做?请继续看
(3)我相信大家现在用软键盘的方法都是创建几十个Button控件组成一个键盘,这样带来两个问题:1.占用大量SRAM(50Button将消耗8Kbytes内存)2.管理麻烦(比如移动、隐藏、禁用等等)
(4)既然ButtonSKB1Button控件,那么所有ButtonAPP函数都适用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 (232 KB, 下载次数: 332)
ButtonSKB控件效果演示(未使用位图皮肤).rar (218 KB, 下载次数: 305)
ButtonSKB控件源代码(使用位图皮肤).rar (2.82 MB, 下载次数: 281)
ButtonSKB控件源代码(未使用位图皮肤).rar (2.74 MB, 下载次数: 319)

评分

参与人数 1 +5 收起 理由
eric2013 + 5

查看全部评分

精美、便捷的emWin界面设计-GLCD
回复

使用道具 举报

14

主题

78

回帖

120

积分

初级会员

积分
120
发表于 2016-6-27 16:55:56 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2016-6-28 11:07:41 | 显示全部楼层
非常感谢楼主分享,[s:151] [s:151]
回复

使用道具 举报

4

主题

21

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2016-7-1 13:15:56 | 显示全部楼层
修正了3个问题:
(1)之前版本忘记绘制背景了,现加上。
(2)去掉键盘当中的小按键的聚焦,因为小按键的聚焦只是绘图出来的效果,没有任何的功能性,没有任何的意义。
(3)增加整个软键盘的聚焦,即可以通过Tab键聚焦到整个大键盘上。
image006.gif

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

使用道具 举报

17

主题

177

回帖

233

积分

高级会员

积分
233
QQ
发表于 2016-7-6 16:34:47 | 显示全部楼层
[s:151] [s:151]
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2022-8-31 15:08:39 | 显示全部楼层
正需要这个,谢谢分享
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-10 01:27 , Processed in 0.299651 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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