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

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

[复制链接]
glcd 发布时间:2016-6-27 16:50
本帖最后由 glcd 于 2016-6-27 16:54 编辑 9 ?# W  ?' W3 s& G+ A7 R
8 G+ Z2 N. i5 _( P* N: F8 c
花了两天时间做了个emWin软键盘控件,并命名为ButtonSKB控件:& _. M0 ?: y! O8 {
image001.png 6 s" I& L+ Z4 K4 l4 \# {/ W  P. G* h7 z
8 c9 x  J* K# K9 y' Z
前言:. l) s! N6 m# S
(1)ButtonSKB已经是1个控件,即可以像使用Button控件一样使用ButtonSKB。! v( \5 e9 a4 y
(2)ButtonSKB是由Button控件修改而来(通过skinning方式),其实是在1个大的按键里面”绘制”出多个小按键(注意是”绘制”,而不是”创建”),即ButtonSKB实际上是1个按键,只是把这个按键的绘图函数改了,改成我们自己的绘图函数并绘制出多个小按键,为什么这么做?请继续看…$ \% h/ i4 {3 h; k: e  Y# i8 i
(3)我相信大家现在用软键盘的方法都是创建几十个Button控件组成一个键盘,这样带来两个问题:1.占用大量SRAM(50个Button将消耗8Kbytes内存),2.管理麻烦(比如移动、隐藏、禁用等等)" H5 S: Y7 N7 U* V; d+ X! l
(4)既然ButtonSKB是1个Button控件,那么所有Button的APP函数都适用ButtonSKB;只是要修改里面的小按键的属性怎么办?只能通过修改上面所说的绘图函数。: F: C& c" Z9 Y+ q
(5)论坛高手那么多,谁能把ButtonSKB演变成中文输入法控件?但是不能占用太多SRAM,在此谢过!

! ?& Z0 n- i: m5 D& n1 o) [
ButtonSKB使用方法:
4 @3 o- w- ~4 N1 u4 e' T/ L& F" g(1)用GUIbuilder创建一个WINDOW窗体并放置Button控件,然后另存为WindowDLG.c;当然你可以设计任何形式的软键盘,只是别忘了一定是WINDOW+Button组成:
image003.png 2 [6 y, p+ M/ L5 @  Z
/ N$ t& A+ K/ V; L
(2)复制WindowDLG.c下面的ID定义和控件结构体到SKIN_buttonSKB.c文件(代替原来的):, I6 k* _2 s+ N  ~
#define ID_WINDOW_0  (GUI_ID_USER + 0x00)
& d# A4 q' L2 l& h6 f#define ID_BUTTON_0  (GUI_ID_USER + 0x02)
% l9 L7 e0 V  ~" B3 |* x#define ID_BUTTON_1  (GUI_ID_USER + 0x03)
9 p' i, {" {" [9 \9 {; y7 y….. b- E4 u+ |, B0 G3 ^- S, J; t
#define ID_BUTTON_18  (GUI_ID_USER + 0x14)
& E2 \# s7 Y) e% g: H, S#define ID_BUTTON_19  (GUI_ID_USER + 0x15)* R8 V( n! y5 P2 f8 ?
2 i& z& X+ `/ l! M. P/ }
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
6 E: p7 k* ^9 Z% V  { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 151, 207, 0, 0x0, 0 },+ \+ A5 B/ M9 x2 Y
  { BUTTON_CreateIndirect, "Ent", ID_BUTTON_0, 113, 168, 31, 31, 0, 0x0, 0 },+ f7 [/ v" r3 L& Y
  { BUTTON_CreateIndirect, ".", ID_BUTTON_1, 78, 168, 31, 31, 0, 0x0, 0 },7 Z; f% d8 H) E5 V6 f
  { BUTTON_CreateIndirect, ",", ID_BUTTON_2, 43, 168, 31, 31, 0, 0x0, 0 },
* A- s, a: }2 R: A, w* G, z& o  { BUTTON_CreateIndirect, "0", ID_BUTTON_3, 7, 168, 31, 31, 0, 0x0, 0 },% z/ G. K9 B. w" E& V
  ….
1 y+ m5 G+ i0 \% u8 D( ?  { BUTTON_CreateIndirect, "/", ID_BUTTON_17, 78, 17, 31, 31, 0, 0x0, 0 },
8 D# L! O& x& i! F* a8 x  { BUTTON_CreateIndirect, "=", ID_BUTTON_18, 43, 17, 31, 32, 0, 0x0, 0 },3 i; s0 m; Q5 _8 c: ]
  { BUTTON_CreateIndirect, "Del", ID_BUTTON_19, 6, 17, 31, 31, 0, 0x0, 0 },
- q/ |9 N, S+ o1 O};
7 s* l7 N6 [) @( j/ \
7 J! y/ p5 ?& w7 S
(3)经过上面2个步骤,buttonSKB控件已经修改完成,怎么调用使用它?当然是把它当做一个Button按键控件来使用:
8 L$ Y6 j7 N3 x2 }5 }/ [static const GUI_WIDGET_CREATE_INFO _aDialogCreateSKB[] = {
* G  y) _4 R( f% `; X9 ?; D  { FRAMEWIN_CreateIndirect, "  neqee.com", ID_FRAMEWIN_0, 40, 25, 161, 232, FRAMEWIN_CF_MOVEABLE, 0 },6 @% j! P& S. ~$ k6 L1 k; U) \
  { BUTTON_CreateIndirect, "", ID_BUTTON_8, 0, 0, 151, 207, 0, 0x0, 2 },//SKB 注意最后1个参数是2
. R4 s8 F- X/ P2 s0 h1 U  D5 Y& U  { EDIT_CreateIndirect, "Edit", ID_EDIT_0, 120, 1, 23, 13, 0, 0x64, 0 },
6 A* O0 @, A% f/ s, \};' w( A) ?5 |% u9 {7 s
其中” ID_BUTTON_8”就是这个软键盘控件。
9 N1 c  g5 b; s$ x. R" u) s1 w
(4)别忘了在WM_INIT_DIALOG消息中把这个Button控件的绘制函数改成自定义绘制函数,这样我们想把这个Button控件画成什么样都行,emWin已经不参与这个控件的绘制工作了:/ Q& U. }1 H1 ^0 Z& `, X  ^
hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_8);$ c2 P; i  K& t* Z9 a4 B6 i! k
BUTTON_SetSkin(hItem, SKIN_buttonSKB3C);" [% M- x& e- ?- ~4 y
如果不做第4步工作会怎样?当然显示的是那个大按键的原貌:
image005.gif 0 F# @' z/ X* ^4 e) Z
. j$ P+ i5 l4 _/ t8 r5 H
' }, [7 ]/ e% A0 Z( Z; n% Z
(5)再重复一遍:论坛高手那么多,谁能把ButtonSKB演变成中文输入法控件?但是不能占用太多SRAM,在此谢过!
) ]+ N  w: O1 z* x2 R) Z# P, l& x( U/ J) n6 T& X% {
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个问题:9 R$ d4 q" w8 x! l; ?
(1)之前版本忘记绘制背景了,现加上。( v! u, i  Q) I- r- |. B( k
(2)去掉键盘当中的小按键的聚焦,因为小按键的聚焦只是绘图出来的效果,没有任何的功能性,没有任何的意义。) Y1 j$ w0 R0 q3 ]2 w3 }) s
(3)增加整个软键盘的聚焦,即可以通过Tab键聚焦到整个大键盘上。
2 ~' m1 }: ?. s+ N- O( t9 x
image006.gif + v7 M) x3 r  `" O+ M1 m
. C; p' `' \2 m4 ~: r
& D  H9 h0 U8 a+ T( l- t% `/ m# c
顺便说一下,这个ButtonSKB控件有个缺点就是任何1个小按键按下和弹起,所有的小按键都要重新绘制一遍,可能会影响刷屏速度,如果用GLCD并且加上位图皮肤的话就没什么影响;要想解决这个问题,只能按照emWin提供的方法新开发1ButtonSKB控件,而不是通过Skinning方式修改而来,我正在做当中,做好之后再另外开个贴分享给大家
5 B) y0 f( K$ f! Y' `% ]8 H新开发的ButtonSKB控件将加入新功能,软键盘当中的小按键能够聚焦,能够接受实体键盘的控制,比如通过实体键盘的Tab键聚焦到软键盘之后,可以通过实体键盘的上下左右移动软键盘小按键的聚焦点,然后按实体键盘的Enter键点击被聚焦的小按键。

4 v) t' L6 q; T, J
7 y; {0 q* i( ?5 h5 Q$ g

" r6 o& [+ r' e0 v5 ^: X8 q ButtonSKB控件源代码(使用位图皮肤)_v105.rar (2.85 MB, 下载次数: 92)
savageok 回答时间:2020-4-11 22:03:53
glcd 发表于 2016-7-1 12:59" X* P. V/ n; g5 I% t1 `
修正了3个问题:6 N. b7 [9 g( h; K
(1)之前版本忘记绘制背景了,现加上。
+ t' X* m' f4 u* [' P- a' K" L4 V* Q(2)去掉键盘当中的小按键的聚焦,因为小按键的聚焦 ...

: T$ g' J& i- l; B+ \/ m( P" M非常感谢
glcd 回答时间:2016-6-29 10:07:23
shanji 发表于 2016-6-28 16:08' O5 @- ], `, ^2 Y6 [* p
新手提问,memory used 是怎么统计的?是有API吗?
' }9 s5 ?1 k8 {- V4 `1 q
是的,有函数
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
我只是路过打酱油的& X! ^" |" d9 X) B$ B) [
zengyi703-16313 回答时间:2016-11-19 03:48:11
谢楼主分享
东方冰 回答时间:2017-5-9 19:51:15
谢谢分享!!
123下一页

所属标签

相似分享

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