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

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

[复制链接]
glcd 发布时间:2016-6-27 16:50
本帖最后由 glcd 于 2016-6-27 16:54 编辑
6 ~6 E  [  w5 I  x2 s+ M  o
6 O8 U  T) E7 G8 |) ]6 ^. u花了两天时间做了个emWin软键盘控件,并命名为ButtonSKB控件:& W  G; r& X5 U$ p" O% `
image001.png
2 h$ ]) `  q6 T: E4 ]& D+ v# O, G- S2 ?  U& a5 K) X
前言:
4 a+ y  I) S* v8 U(1)ButtonSKB已经是1个控件,即可以像使用Button控件一样使用ButtonSKB。1 Y+ s5 J* A" H& H/ u6 G
(2)ButtonSKB是由Button控件修改而来(通过skinning方式),其实是在1个大的按键里面”绘制”出多个小按键(注意是”绘制”,而不是”创建”),即ButtonSKB实际上是1个按键,只是把这个按键的绘图函数改了,改成我们自己的绘图函数并绘制出多个小按键,为什么这么做?请继续看…; ^- F0 u0 J- ~. ^. w2 d
(3)我相信大家现在用软键盘的方法都是创建几十个Button控件组成一个键盘,这样带来两个问题:1.占用大量SRAM(50个Button将消耗8Kbytes内存),2.管理麻烦(比如移动、隐藏、禁用等等)
$ D& O9 C+ P/ m(4)既然ButtonSKB是1个Button控件,那么所有Button的APP函数都适用ButtonSKB;只是要修改里面的小按键的属性怎么办?只能通过修改上面所说的绘图函数。
/ b- s  o- Y; D# C( q0 j% q" @(5)论坛高手那么多,谁能把ButtonSKB演变成中文输入法控件?但是不能占用太多SRAM,在此谢过!
# \0 j) _$ y  |6 V# [- z
ButtonSKB使用方法:
) j" B% Y: ?0 @+ z& |+ j(1)用GUIbuilder创建一个WINDOW窗体并放置Button控件,然后另存为WindowDLG.c;当然你可以设计任何形式的软键盘,只是别忘了一定是WINDOW+Button组成:
image003.png 3 M; S% L9 w7 x1 y2 l2 _
9 q4 x1 s: M& K6 D5 A9 t
(2)复制WindowDLG.c下面的ID定义和控件结构体到SKIN_buttonSKB.c文件(代替原来的):
+ T6 R7 j8 \5 O3 ~! w# a9 e#define ID_WINDOW_0  (GUI_ID_USER + 0x00)
' {- M+ {8 h9 Q( e  ~#define ID_BUTTON_0  (GUI_ID_USER + 0x02)
; f: \1 p& a9 P* M& b#define ID_BUTTON_1  (GUI_ID_USER + 0x03)
5 g" B+ p+ g0 V8 O. l+ l! N: Z, J) v….* K% |5 ^* U7 G) t5 E& }
#define ID_BUTTON_18  (GUI_ID_USER + 0x14)
  K8 s3 p7 T& D& V% x#define ID_BUTTON_19  (GUI_ID_USER + 0x15)
$ V$ p# u# s+ ]8 {9 N# v# I7 u
/ Z) F$ Z8 [7 N& ?static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {$ j& C6 i' O* x, b0 N$ }" n
  { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 151, 207, 0, 0x0, 0 },
" D- r+ _0 ], @  { BUTTON_CreateIndirect, "Ent", ID_BUTTON_0, 113, 168, 31, 31, 0, 0x0, 0 },
& a. z5 \& Y5 O3 `8 R1 `  { BUTTON_CreateIndirect, ".", ID_BUTTON_1, 78, 168, 31, 31, 0, 0x0, 0 },6 ?2 K; g) S# m& Z/ X) o
  { BUTTON_CreateIndirect, ",", ID_BUTTON_2, 43, 168, 31, 31, 0, 0x0, 0 },
$ c% W! V1 A' V8 s2 E  { BUTTON_CreateIndirect, "0", ID_BUTTON_3, 7, 168, 31, 31, 0, 0x0, 0 },! Y/ ^! Y3 M( Z8 y  s" }$ s
  ….
2 I; l' l' q# w5 a% k# ?  { BUTTON_CreateIndirect, "/", ID_BUTTON_17, 78, 17, 31, 31, 0, 0x0, 0 },/ z4 G$ Z1 B/ a. D7 d, v  I& \. P
  { BUTTON_CreateIndirect, "=", ID_BUTTON_18, 43, 17, 31, 32, 0, 0x0, 0 },
3 l+ f" }% k2 `0 x  { BUTTON_CreateIndirect, "Del", ID_BUTTON_19, 6, 17, 31, 31, 0, 0x0, 0 },( I6 x# [$ G' F5 k5 Z8 B% Y
};
/ }5 J- d& {5 R# L) @0 V. l' |- x4 c* c: K2 E& I' c  U7 N5 c
(3)经过上面2个步骤,buttonSKB控件已经修改完成,怎么调用使用它?当然是把它当做一个Button按键控件来使用:
) s" ]/ l% X  w2 K8 j) Jstatic const GUI_WIDGET_CREATE_INFO _aDialogCreateSKB[] = {% ~8 r) m' l! j. H
  { FRAMEWIN_CreateIndirect, "  neqee.com", ID_FRAMEWIN_0, 40, 25, 161, 232, FRAMEWIN_CF_MOVEABLE, 0 },
7 C) a9 c3 s+ q+ I+ t2 z* _3 h7 z  { BUTTON_CreateIndirect, "", ID_BUTTON_8, 0, 0, 151, 207, 0, 0x0, 2 },//SKB 注意最后1个参数是2( Y# q, g0 F* W- ~, r# \
  { EDIT_CreateIndirect, "Edit", ID_EDIT_0, 120, 1, 23, 13, 0, 0x64, 0 },; i) Y  F* u* u) e; n
};# y6 j: |# `" }0 Z3 s% c: q
其中” ID_BUTTON_8”就是这个软键盘控件。

: Q4 A6 N$ r+ ]' }
(4)别忘了在WM_INIT_DIALOG消息中把这个Button控件的绘制函数改成自定义绘制函数,这样我们想把这个Button控件画成什么样都行,emWin已经不参与这个控件的绘制工作了:* X: m% w$ @  K6 ?- Y' w
hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_8);
% \6 M, ^" ]1 t& G9 B# jBUTTON_SetSkin(hItem, SKIN_buttonSKB3C);
( D( E: D' f9 }9 C: R1 m1 I2 a如果不做第4步工作会怎样?当然显示的是那个大按键的原貌:
image005.gif
9 T7 a. [. J( }! j3 r: n7 u  M
0 n& h5 w& j- A+ k; b, H3 `
  T: j" Q- {4 D
(5)再重复一遍:论坛高手那么多,谁能把ButtonSKB演变成中文输入法控件?但是不能占用太多SRAM,在此谢过!, E0 u( ?8 y3 Q/ C3 s% L
. K+ m# m, D& A% p4 g7 d! _
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个问题:
" e2 s% {+ s5 i2 q5 y(1)之前版本忘记绘制背景了,现加上。
1 A( V, }  T0 o9 s(2)去掉键盘当中的小按键的聚焦,因为小按键的聚焦只是绘图出来的效果,没有任何的功能性,没有任何的意义。
- u9 t. y: |0 f% v(3)增加整个软键盘的聚焦,即可以通过Tab键聚焦到整个大键盘上。
" x5 F  K5 Y0 t* ~0 J' m
image006.gif
, r$ ^' J% T9 n% u  y2 J+ ^" T5 y; w/ O. r' C3 m+ O

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

$ G0 O2 v& G9 [0 E
* @, }7 V1 W5 y. u, P8 r

$ H: r5 Q% k1 h ButtonSKB控件源代码(使用位图皮肤)_v105.rar (2.85 MB, 下载次数: 92)
savageok 回答时间:2020-4-11 22:03:53
glcd 发表于 2016-7-1 12:59+ Z- Q! x# ]" E" x4 n5 B
修正了3个问题:
3 C2 H# ?( z" X: {: N(1)之前版本忘记绘制背景了,现加上。) b9 D( H7 x% d6 c
(2)去掉键盘当中的小按键的聚焦,因为小按键的聚焦 ...

% y+ ]  }! t6 D4 F0 n7 S( H非常感谢
glcd 回答时间:2016-6-29 10:07:23
shanji 发表于 2016-6-28 16:08, K4 D4 ]3 K" U4 ?" B- q% P1 m& I
新手提问,memory used 是怎么统计的?是有API吗?

# a9 b! ^4 `. l是的,有函数
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
我只是路过打酱油的
+ h8 \! S# B  v6 g
zengyi703-16313 回答时间:2016-11-19 03:48:11
谢楼主分享
东方冰 回答时间:2017-5-9 19:51:15
谢谢分享!!
123下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版