你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

分享一个emWin软键盘控件 精华  

[复制链接]
glcd 发布时间:2016-6-27 16:50
本帖最后由 glcd 于 2016-6-27 16:54 编辑
0 x$ v/ a4 b* L7 l$ {2 }! ^- D5 B7 c# y
花了两天时间做了个emWin软键盘控件,并命名为ButtonSKB控件:7 ?0 b9 t! n6 g- S; z( z$ h
image001.png
5 X( @* Z: C3 R8 D* h! k0 D3 b# m: n  _& d
前言:5 o. E' |; w3 T' g' d( X3 @
(1)ButtonSKB已经是1个控件,即可以像使用Button控件一样使用ButtonSKB。
9 y/ d+ P: T8 `0 e9 i! j(2)ButtonSKB是由Button控件修改而来(通过skinning方式),其实是在1个大的按键里面”绘制”出多个小按键(注意是”绘制”,而不是”创建”),即ButtonSKB实际上是1个按键,只是把这个按键的绘图函数改了,改成我们自己的绘图函数并绘制出多个小按键,为什么这么做?请继续看…" E$ D6 }) m- J' x) l  E! G
(3)我相信大家现在用软键盘的方法都是创建几十个Button控件组成一个键盘,这样带来两个问题:1.占用大量SRAM(50个Button将消耗8Kbytes内存),2.管理麻烦(比如移动、隐藏、禁用等等)
0 }1 N& k- u( C(4)既然ButtonSKB是1个Button控件,那么所有Button的APP函数都适用ButtonSKB;只是要修改里面的小按键的属性怎么办?只能通过修改上面所说的绘图函数。
; p+ p8 A8 P! Q- @" e" {. D. y7 o(5)论坛高手那么多,谁能把ButtonSKB演变成中文输入法控件?但是不能占用太多SRAM,在此谢过!

* |% q1 ~" V0 N0 g  P$ Y
ButtonSKB使用方法:& S8 q9 M- C! F! B
(1)用GUIbuilder创建一个WINDOW窗体并放置Button控件,然后另存为WindowDLG.c;当然你可以设计任何形式的软键盘,只是别忘了一定是WINDOW+Button组成:
image003.png
" M" |$ D$ Q) |, N% n% ~  a" D& K2 u6 }
(2)复制WindowDLG.c下面的ID定义和控件结构体到SKIN_buttonSKB.c文件(代替原来的):
! f/ M0 R+ `# u% T#define ID_WINDOW_0  (GUI_ID_USER + 0x00)4 H% s; f$ m% w
#define ID_BUTTON_0  (GUI_ID_USER + 0x02)
6 K- f3 g7 w. Q#define ID_BUTTON_1  (GUI_ID_USER + 0x03)0 }  Y, o' k3 m- ^5 E, m$ l+ g
….
- Y0 J! q* l& f* w. A" a2 B#define ID_BUTTON_18  (GUI_ID_USER + 0x14)' V5 r) y& o, J1 W. |7 s
#define ID_BUTTON_19  (GUI_ID_USER + 0x15)
# B6 P& K2 O' ~9 R. o9 \9 H
' r2 C# i4 N  Q: Tstatic const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
7 J# i7 T7 R" c7 d  h% r1 R  { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 151, 207, 0, 0x0, 0 },
, b* Z7 o+ J; l+ v  M, N4 I  { BUTTON_CreateIndirect, "Ent", ID_BUTTON_0, 113, 168, 31, 31, 0, 0x0, 0 },# c# K- [! ^8 b4 ?
  { BUTTON_CreateIndirect, ".", ID_BUTTON_1, 78, 168, 31, 31, 0, 0x0, 0 },7 i- r7 u$ w9 R- p# }
  { BUTTON_CreateIndirect, ",", ID_BUTTON_2, 43, 168, 31, 31, 0, 0x0, 0 },
9 g( m& U* w( A( S0 f- B  { BUTTON_CreateIndirect, "0", ID_BUTTON_3, 7, 168, 31, 31, 0, 0x0, 0 },8 x+ H, g$ r+ i5 b, O$ e
  …." B5 d6 B# g+ |6 [! o
  { BUTTON_CreateIndirect, "/", ID_BUTTON_17, 78, 17, 31, 31, 0, 0x0, 0 },
9 \- K( r0 L- W+ @. R  { BUTTON_CreateIndirect, "=", ID_BUTTON_18, 43, 17, 31, 32, 0, 0x0, 0 },: l% Z( ^: R& M# E
  { BUTTON_CreateIndirect, "Del", ID_BUTTON_19, 6, 17, 31, 31, 0, 0x0, 0 },
/ ~! g1 L1 v6 Y. n- s5 h3 i3 O; J0 q& L};4 y% C* b; o( G" J" s, K* T- O! I
* c* p; F; C6 ?
(3)经过上面2个步骤,buttonSKB控件已经修改完成,怎么调用使用它?当然是把它当做一个Button按键控件来使用:; F% v" g, G7 b/ A% F, I
static const GUI_WIDGET_CREATE_INFO _aDialogCreateSKB[] = {
- z- ^: L' j! O$ |! I$ g! U0 p  { FRAMEWIN_CreateIndirect, "  neqee.com", ID_FRAMEWIN_0, 40, 25, 161, 232, FRAMEWIN_CF_MOVEABLE, 0 },. m% _& L9 z% [9 H6 D8 m8 t' |
  { BUTTON_CreateIndirect, "", ID_BUTTON_8, 0, 0, 151, 207, 0, 0x0, 2 },//SKB 注意最后1个参数是27 ]1 C6 U* k! S( S- z' h4 a1 Z# V
  { EDIT_CreateIndirect, "Edit", ID_EDIT_0, 120, 1, 23, 13, 0, 0x64, 0 },
* j. x9 g4 V4 |! o4 s};
$ K. D  E' G1 m* P其中” ID_BUTTON_8”就是这个软键盘控件。

3 |* C0 y6 K3 b& G
(4)别忘了在WM_INIT_DIALOG消息中把这个Button控件的绘制函数改成自定义绘制函数,这样我们想把这个Button控件画成什么样都行,emWin已经不参与这个控件的绘制工作了:1 |- c4 Q' O$ }# o& Z
hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_8);- ?7 S7 f+ }# b4 K' l" G" `6 t' D6 V
BUTTON_SetSkin(hItem, SKIN_buttonSKB3C);
5 \+ Z" N4 T) ^% B& O2 t0 Z2 W如果不做第4步工作会怎样?当然显示的是那个大按键的原貌:
image005.gif $ e$ e: N3 ?( s- S3 e
) q. B! X; t% ~" E) \$ d

6 Z6 S. k" s  b) }/ Q) d(5)再重复一遍:论坛高手那么多,谁能把ButtonSKB演变成中文输入法控件?但是不能占用太多SRAM,在此谢过!' p" p: Q, w; w0 U4 F, [' }+ ]! H2 F
0 g: N% u, q2 x3 F
ButtonSKB控件效果演示(使用位图皮肤).rar (231.15 KB, 下载次数: 121)

评分

参与人数 1 ST金币 +10 收起 理由
wofei1314 + 10

查看全部评分

收藏 8 评论34 发布时间:2016-6-27 16:50

举报

34个回答
glcd 回答时间:2016-7-1 12:59:11
修正了3个问题:
1 `9 A: R0 ^! e2 c! ]2 `0 o(1)之前版本忘记绘制背景了,现加上。
- v) I8 `* ^+ p6 h9 X. |3 r# Q(2)去掉键盘当中的小按键的聚焦,因为小按键的聚焦只是绘图出来的效果,没有任何的功能性,没有任何的意义。
* _  [2 q" o2 {* l8 N  d0 Q(3)增加整个软键盘的聚焦,即可以通过Tab键聚焦到整个大键盘上。
  T1 U5 ]$ _% s! m, k4 M; `
image006.gif
2 X0 |( i. r0 T1 v) c0 C1 j; O9 {1 A/ S( V& N* Z* _: n

" ]' d' v! ^( M9 t顺便说一下,这个ButtonSKB控件有个缺点就是任何1个小按键按下和弹起,所有的小按键都要重新绘制一遍,可能会影响刷屏速度,如果用GLCD并且加上位图皮肤的话就没什么影响;要想解决这个问题,只能按照emWin提供的方法新开发1ButtonSKB控件,而不是通过Skinning方式修改而来,我正在做当中,做好之后再另外开个贴分享给大家
5 H, o0 d  E% K4 V) c" e7 z新开发的ButtonSKB控件将加入新功能,软键盘当中的小按键能够聚焦,能够接受实体键盘的控制,比如通过实体键盘的Tab键聚焦到软键盘之后,可以通过实体键盘的上下左右移动软键盘小按键的聚焦点,然后按实体键盘的Enter键点击被聚焦的小按键。
7 n* H" h6 l: Y0 r' ?) d2 e) q/ s

; Q5 B  }8 ~! _; F: ]; ^$ j
! L5 n7 S  \7 G$ r
ButtonSKB控件源代码(使用位图皮肤)_v105.rar (2.85 MB, 下载次数: 92)
savageok 回答时间:2020-4-11 22:03:53
glcd 发表于 2016-7-1 12:598 h+ R% W6 Q* D+ r+ k
修正了3个问题:
0 g9 j8 W' j9 J$ N5 H1 m(1)之前版本忘记绘制背景了,现加上。
  G& |8 X0 F# p(2)去掉键盘当中的小按键的聚焦,因为小按键的聚焦 ...
. L' R: R. R) N0 `# a: G1 B7 O% {
非常感谢
glcd 回答时间:2016-6-29 10:07:23
shanji 发表于 2016-6-28 16:08  p2 g' f* N( X' t3 p% |6 K
新手提问,memory used 是怎么统计的?是有API吗?
, X" u. o3 g# ~- ~9 m
是的,有函数
yanhaijian 回答时间:2016-6-27 18:20:28
最重要的一步是将按键输入焦点失能。
glcd 回答时间:2016-6-27 19:24:18
你意思是里面的小按键不需要聚焦,只聚焦整个软键盘吗?
kaierwen 回答时间:2016-6-28 15:56:58
shanji 回答时间:2016-6-28 16:08:00
新手提问,memory used 是怎么统计的?是有API吗?
accelerating 回答时间:2016-7-3 08:50:40
又是一年春来到 回答时间:2016-7-10 11:53:34
雅轩设计 回答时间:2016-10-21 11:17:13
请问楼主您的这个源码怎样打开呢?用什么样的软件?
黑皮男 回答时间:2016-10-21 13:09:46
多谢分享,很高大上
周超 回答时间:2016-11-18 16:12:54
高大上的感觉
zbber 回答时间:2016-11-18 17:21:51
我只是路过打酱油的
6 y. c4 t; B" H' a, W, n! n- d! h
zengyi703-16313 回答时间:2016-11-19 03:48:11
谢楼主分享
东方冰 回答时间:2017-5-9 19:51:15
谢谢分享!!
123下一页

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版