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

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

[复制链接]
glcd 发布时间:2016-6-27 16:50
本帖最后由 glcd 于 2016-6-27 16:54 编辑
0 b* S2 G5 K0 M+ H$ a
" y" b* E2 a4 D* w7 l; D花了两天时间做了个emWin软键盘控件,并命名为ButtonSKB控件:' [* r& p! G2 U' ^  @& @
image001.png & D; G& k4 c- n( i  E6 m! u# c" g

& b( H1 C+ I$ x$ `2 Z, O" z5 R
前言:
# j- j; F* o9 r8 t+ ~1 _(1)ButtonSKB已经是1个控件,即可以像使用Button控件一样使用ButtonSKB。
8 A2 `6 n4 h& {5 n% W8 o(2)ButtonSKB是由Button控件修改而来(通过skinning方式),其实是在1个大的按键里面”绘制”出多个小按键(注意是”绘制”,而不是”创建”),即ButtonSKB实际上是1个按键,只是把这个按键的绘图函数改了,改成我们自己的绘图函数并绘制出多个小按键,为什么这么做?请继续看…: L" H6 [5 c  k  p
(3)我相信大家现在用软键盘的方法都是创建几十个Button控件组成一个键盘,这样带来两个问题:1.占用大量SRAM(50个Button将消耗8Kbytes内存),2.管理麻烦(比如移动、隐藏、禁用等等)
2 E. i; {! w0 Z; n) n(4)既然ButtonSKB是1个Button控件,那么所有Button的APP函数都适用ButtonSKB;只是要修改里面的小按键的属性怎么办?只能通过修改上面所说的绘图函数。
" @7 c% n* {- {% m5 `(5)论坛高手那么多,谁能把ButtonSKB演变成中文输入法控件?但是不能占用太多SRAM,在此谢过!
, u; x) z* J' \* Z  r' V! C: C
ButtonSKB使用方法:
2 d/ f( c4 g3 t) [  g* d4 v(1)用GUIbuilder创建一个WINDOW窗体并放置Button控件,然后另存为WindowDLG.c;当然你可以设计任何形式的软键盘,只是别忘了一定是WINDOW+Button组成:
image003.png
6 q1 u& E1 J* P+ w' r7 V* _; |' V: V; I5 U. L8 m) x
(2)复制WindowDLG.c下面的ID定义和控件结构体到SKIN_buttonSKB.c文件(代替原来的):% O& s7 T9 T3 @* p+ l
#define ID_WINDOW_0  (GUI_ID_USER + 0x00)
  z8 D# f( O3 k: K2 M6 K' A#define ID_BUTTON_0  (GUI_ID_USER + 0x02)
4 ?0 [6 x8 V8 f1 T2 k# J#define ID_BUTTON_1  (GUI_ID_USER + 0x03)4 N3 e1 H! Q& I5 S1 h: P1 V
….7 r7 s" Z/ k/ F* N* F5 J. j
#define ID_BUTTON_18  (GUI_ID_USER + 0x14)
6 t' e$ `7 P# X" P, E& P9 a#define ID_BUTTON_19  (GUI_ID_USER + 0x15)0 e; Y8 K- Q& H* ^) n, G+ F

3 H8 u8 K) V( {- Q. ]7 K5 ustatic const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
8 {9 u: P& b0 P3 x2 \  { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 151, 207, 0, 0x0, 0 },
8 u% I$ W7 x$ @  { BUTTON_CreateIndirect, "Ent", ID_BUTTON_0, 113, 168, 31, 31, 0, 0x0, 0 },
6 N3 w. I0 y* N, P. U  { BUTTON_CreateIndirect, ".", ID_BUTTON_1, 78, 168, 31, 31, 0, 0x0, 0 },
5 D( k) P5 x, w  r0 H7 L  { BUTTON_CreateIndirect, ",", ID_BUTTON_2, 43, 168, 31, 31, 0, 0x0, 0 },
2 t4 Z$ ^! X; F# @9 y9 A2 Y6 o- O% o# {  { BUTTON_CreateIndirect, "0", ID_BUTTON_3, 7, 168, 31, 31, 0, 0x0, 0 },( Q# c$ a8 d1 N/ b' Q) Z3 ]- E  H
  ….6 l! q( e' h8 A- ?4 [" r. B1 l
  { BUTTON_CreateIndirect, "/", ID_BUTTON_17, 78, 17, 31, 31, 0, 0x0, 0 },
" g% R* }5 M% M4 q. Y, j  { BUTTON_CreateIndirect, "=", ID_BUTTON_18, 43, 17, 31, 32, 0, 0x0, 0 },. T9 q, w- b4 ~( Z1 m! {
  { BUTTON_CreateIndirect, "Del", ID_BUTTON_19, 6, 17, 31, 31, 0, 0x0, 0 },. S( \, m. @& \/ _8 G/ w
};
8 e1 Z+ u  k4 J* N4 Q/ W% L) N
1 X9 f6 S; W9 m3 A/ I4 o6 V
(3)经过上面2个步骤,buttonSKB控件已经修改完成,怎么调用使用它?当然是把它当做一个Button按键控件来使用:
6 [- ~: c) [, u; jstatic const GUI_WIDGET_CREATE_INFO _aDialogCreateSKB[] = {1 a: E4 }, t5 P: Z
  { FRAMEWIN_CreateIndirect, "  neqee.com", ID_FRAMEWIN_0, 40, 25, 161, 232, FRAMEWIN_CF_MOVEABLE, 0 },0 T0 I) N6 l0 ?5 V3 R
  { BUTTON_CreateIndirect, "", ID_BUTTON_8, 0, 0, 151, 207, 0, 0x0, 2 },//SKB 注意最后1个参数是2( w& d% O  p& R4 I6 u. ]
  { EDIT_CreateIndirect, "Edit", ID_EDIT_0, 120, 1, 23, 13, 0, 0x64, 0 },: |5 P9 L! |) ]5 ]2 R8 O
};, ~4 ~& e; R( o: i
其中” ID_BUTTON_8”就是这个软键盘控件。

5 T0 G6 b, l( C1 ]7 w
(4)别忘了在WM_INIT_DIALOG消息中把这个Button控件的绘制函数改成自定义绘制函数,这样我们想把这个Button控件画成什么样都行,emWin已经不参与这个控件的绘制工作了:0 B; Y; e, s2 m  b, B3 q; ?
hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_8);% c6 v+ B; {3 Q& E# ^: |
BUTTON_SetSkin(hItem, SKIN_buttonSKB3C);& s1 c- X, L* E  S4 L) {0 R
如果不做第4步工作会怎样?当然显示的是那个大按键的原貌:
image005.gif % x4 @, C6 g. R6 O% x2 ~7 D
2 J/ C  W* w2 {$ Z2 E
  i6 n4 P: t* t' L3 \% j# i$ x% A9 E
(5)再重复一遍:论坛高手那么多,谁能把ButtonSKB演变成中文输入法控件?但是不能占用太多SRAM,在此谢过!
% y  R% F0 n* x: W5 r9 W/ B0 ~+ q6 ^3 {  \' y) s0 R$ j
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个问题:4 V6 F* Z2 C' k8 l: w" `. T! I5 O
(1)之前版本忘记绘制背景了,现加上。  T5 a4 D* B( |1 S
(2)去掉键盘当中的小按键的聚焦,因为小按键的聚焦只是绘图出来的效果,没有任何的功能性,没有任何的意义。$ q5 o; O: l! [8 l6 |; }0 M; L
(3)增加整个软键盘的聚焦,即可以通过Tab键聚焦到整个大键盘上。
4 Z2 h8 w4 R: ~
image006.gif ( f& ~) t0 L3 N/ E
& T: s: ]) s, x
1 E! S& t7 N  Y( v9 s% E, ]
顺便说一下,这个ButtonSKB控件有个缺点就是任何1个小按键按下和弹起,所有的小按键都要重新绘制一遍,可能会影响刷屏速度,如果用GLCD并且加上位图皮肤的话就没什么影响;要想解决这个问题,只能按照emWin提供的方法新开发1ButtonSKB控件,而不是通过Skinning方式修改而来,我正在做当中,做好之后再另外开个贴分享给大家
$ O3 \" W0 P) h新开发的ButtonSKB控件将加入新功能,软键盘当中的小按键能够聚焦,能够接受实体键盘的控制,比如通过实体键盘的Tab键聚焦到软键盘之后,可以通过实体键盘的上下左右移动软键盘小按键的聚焦点,然后按实体键盘的Enter键点击被聚焦的小按键。
/ l# D: F. ?" V! D* c  n" H3 I0 }
5 E& ]' P6 c# a

- L9 ~6 J+ W2 m( }" R0 a/ c1 i ButtonSKB控件源代码(使用位图皮肤)_v105.rar (2.85 MB, 下载次数: 92)
savageok 回答时间:2020-4-11 22:03:53
glcd 发表于 2016-7-1 12:59
# O; _) v- P1 h! ~/ ^修正了3个问题:
( h. m" e6 d7 L, C(1)之前版本忘记绘制背景了,现加上。; O( D1 u7 b$ n" S; G/ \; ^
(2)去掉键盘当中的小按键的聚焦,因为小按键的聚焦 ...

8 Z7 @6 J! Z" w# `非常感谢
glcd 回答时间:2016-6-29 10:07:23
shanji 发表于 2016-6-28 16:084 k# a7 J# F1 m" R
新手提问,memory used 是怎么统计的?是有API吗?
' {( ]* w/ g; t5 V4 Z
是的,有函数
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
我只是路过打酱油的, o6 R2 P" }2 X3 p, o5 y: u" ]
zengyi703-16313 回答时间:2016-11-19 03:48:11
谢楼主分享
东方冰 回答时间:2017-5-9 19:51:15
谢谢分享!!
123下一页

所属标签

相似分享

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