请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
glcd 发布时间:2016-6-27 16:50
本帖最后由 glcd 于 2016-6-27 16:54 编辑
/ @9 q! \$ \6 T+ w7 I
3 D: {$ `- }" d2 |* g, W9 v( Q花了两天时间做了个emWin软键盘控件,并命名为ButtonSKB控件:
% C: G- D6 k$ y6 O image001.png
# `5 t" |/ d: f! N$ d
* O; }; h) ~; t) \: |) g& ~* V0 A, O
前言:
" N% Z9 o1 N. g1 k9 N" e7 ~' \" Q: _(1)ButtonSKB已经是1个控件,即可以像使用Button控件一样使用ButtonSKB。
. L. h0 }1 u& q" G8 Z7 J(2)ButtonSKB是由Button控件修改而来(通过skinning方式),其实是在1个大的按键里面”绘制”出多个小按键(注意是”绘制”,而不是”创建”),即ButtonSKB实际上是1个按键,只是把这个按键的绘图函数改了,改成我们自己的绘图函数并绘制出多个小按键,为什么这么做?请继续看…
% A- ^5 T5 K: y(3)我相信大家现在用软键盘的方法都是创建几十个Button控件组成一个键盘,这样带来两个问题:1.占用大量SRAM(50个Button将消耗8Kbytes内存),2.管理麻烦(比如移动、隐藏、禁用等等)5 o7 e+ H' F" n6 a5 @2 N
(4)既然ButtonSKB是1个Button控件,那么所有Button的APP函数都适用ButtonSKB;只是要修改里面的小按键的属性怎么办?只能通过修改上面所说的绘图函数。- N) d5 K. V, B- [' o# I" b3 b
(5)论坛高手那么多,谁能把ButtonSKB演变成中文输入法控件?但是不能占用太多SRAM,在此谢过!
; F0 _" W3 h9 x* E2 Z9 M
ButtonSKB使用方法:
" v2 d! E' a/ t) o2 ^(1)用GUIbuilder创建一个WINDOW窗体并放置Button控件,然后另存为WindowDLG.c;当然你可以设计任何形式的软键盘,只是别忘了一定是WINDOW+Button组成:
image003.png
% i. t3 p, G+ J" Q3 f# m) {: m% Z5 }- z
(2)复制WindowDLG.c下面的ID定义和控件结构体到SKIN_buttonSKB.c文件(代替原来的):! a8 n% K) d0 e2 F& e  Q" ^
#define ID_WINDOW_0  (GUI_ID_USER + 0x00)% E" F7 A+ F  s
#define ID_BUTTON_0  (GUI_ID_USER + 0x02)
, }9 p6 u7 d5 l5 T  y#define ID_BUTTON_1  (GUI_ID_USER + 0x03)
# |8 b7 X0 B) E" |, t- K….
3 o5 q: ^$ l/ W#define ID_BUTTON_18  (GUI_ID_USER + 0x14)
: I. R! m" D. p; ~#define ID_BUTTON_19  (GUI_ID_USER + 0x15)3 b+ r2 l% [  v# |

' x6 k6 `9 \) X4 @static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {6 d0 U" s/ W8 P5 i$ G6 K1 S7 i2 t6 e
  { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 151, 207, 0, 0x0, 0 },
3 U2 {! k% f2 A" [4 h  { BUTTON_CreateIndirect, "Ent", ID_BUTTON_0, 113, 168, 31, 31, 0, 0x0, 0 },
4 g* ~# O' L$ F- S  { BUTTON_CreateIndirect, ".", ID_BUTTON_1, 78, 168, 31, 31, 0, 0x0, 0 },
% J2 c5 v5 L+ f( ~  { BUTTON_CreateIndirect, ",", ID_BUTTON_2, 43, 168, 31, 31, 0, 0x0, 0 },1 E& N% D9 Z& h' s! o
  { BUTTON_CreateIndirect, "0", ID_BUTTON_3, 7, 168, 31, 31, 0, 0x0, 0 },
- @6 j  p% x9 t1 O, o! H# F' v1 r" d  ….( \) I$ l3 O( E' C- X6 K
  { BUTTON_CreateIndirect, "/", ID_BUTTON_17, 78, 17, 31, 31, 0, 0x0, 0 },
9 h; G; N" x2 s) ?: ^* X' T5 s- O7 E  { BUTTON_CreateIndirect, "=", ID_BUTTON_18, 43, 17, 31, 32, 0, 0x0, 0 },
& ?) V/ b& f: l5 R# ]2 B. _  { BUTTON_CreateIndirect, "Del", ID_BUTTON_19, 6, 17, 31, 31, 0, 0x0, 0 },
, A+ e/ k1 L4 v5 @% S};
/ p4 u9 R: Y: Y$ G: C8 t. u. x5 u/ Y
(3)经过上面2个步骤,buttonSKB控件已经修改完成,怎么调用使用它?当然是把它当做一个Button按键控件来使用:
$ S9 |1 Q  ~/ astatic const GUI_WIDGET_CREATE_INFO _aDialogCreateSKB[] = {
$ [' Z6 s+ \& G% N/ S0 B0 B: `  { FRAMEWIN_CreateIndirect, "  neqee.com", ID_FRAMEWIN_0, 40, 25, 161, 232, FRAMEWIN_CF_MOVEABLE, 0 },1 {: p- ?' x) q9 e  y$ G
  { BUTTON_CreateIndirect, "", ID_BUTTON_8, 0, 0, 151, 207, 0, 0x0, 2 },//SKB 注意最后1个参数是2
0 R2 w  L7 G7 u  { EDIT_CreateIndirect, "Edit", ID_EDIT_0, 120, 1, 23, 13, 0, 0x64, 0 },* I, ~2 v; R# `( [# b/ q
};
3 y# p/ \9 f  x4 G8 J其中” ID_BUTTON_8”就是这个软键盘控件。
" g) d# y" W5 a9 N6 n* l
(4)别忘了在WM_INIT_DIALOG消息中把这个Button控件的绘制函数改成自定义绘制函数,这样我们想把这个Button控件画成什么样都行,emWin已经不参与这个控件的绘制工作了:# u, a/ W9 C' i3 l% P. e, c
hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_8);: W) a6 G$ V  Q9 u* }
BUTTON_SetSkin(hItem, SKIN_buttonSKB3C);6 p4 G( z! O8 P% C% a3 L
如果不做第4步工作会怎样?当然显示的是那个大按键的原貌:
image005.gif
3 Y6 j% P6 Z; W3 W9 p
; Z! l! W+ G) x0 S

$ k, v, @! x% f- J; g0 H0 v(5)再重复一遍:论坛高手那么多,谁能把ButtonSKB演变成中文输入法控件?但是不能占用太多SRAM,在此谢过!% _  |2 [0 |. [' Q

# F( d( P+ x  ?4 `9 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个问题:, w$ q* S5 Q( W5 W0 }3 o5 o% w
(1)之前版本忘记绘制背景了,现加上。/ [6 |$ T4 Y7 O, Z8 X3 l/ P, R
(2)去掉键盘当中的小按键的聚焦,因为小按键的聚焦只是绘图出来的效果,没有任何的功能性,没有任何的意义。
% V0 ^* ?, T5 M$ @: U8 w7 J6 y(3)增加整个软键盘的聚焦,即可以通过Tab键聚焦到整个大键盘上。

" e6 G5 Y2 R7 M9 i0 |: C5 O image006.gif % j6 l8 [/ G1 l/ |4 w% @

) j/ p! @$ @7 N! I
( V2 T% ?$ v4 w% _6 a
顺便说一下,这个ButtonSKB控件有个缺点就是任何1个小按键按下和弹起,所有的小按键都要重新绘制一遍,可能会影响刷屏速度,如果用GLCD并且加上位图皮肤的话就没什么影响;要想解决这个问题,只能按照emWin提供的方法新开发1ButtonSKB控件,而不是通过Skinning方式修改而来,我正在做当中,做好之后再另外开个贴分享给大家: X4 B# T6 R4 A7 Y5 [( K
新开发的ButtonSKB控件将加入新功能,软键盘当中的小按键能够聚焦,能够接受实体键盘的控制,比如通过实体键盘的Tab键聚焦到软键盘之后,可以通过实体键盘的上下左右移动软键盘小按键的聚焦点,然后按实体键盘的Enter键点击被聚焦的小按键。
- S; H5 g/ t$ f4 s
9 \% ^8 K# [! [4 ^" f6 R6 w
! D) q2 F/ @3 p; h, v5 A' c
ButtonSKB控件源代码(使用位图皮肤)_v105.rar (2.85 MB, 下载次数: 92)
savageok 回答时间:2020-4-11 22:03:53
glcd 发表于 2016-7-1 12:59
. l7 P+ b# \) ^# v, X( W# d修正了3个问题:
# h  z5 z. \8 ~3 h, M! c(1)之前版本忘记绘制背景了,现加上。
# `% V% i' }+ n8 P(2)去掉键盘当中的小按键的聚焦,因为小按键的聚焦 ...

7 ]8 g# [6 q9 X- b. i* T非常感谢
glcd 回答时间:2016-6-29 10:07:23
shanji 发表于 2016-6-28 16:08
& W' w; I5 o0 i4 v新手提问,memory used 是怎么统计的?是有API吗?

/ {; O2 w* g; {是的,有函数
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
我只是路过打酱油的4 _- u* U' K- Q$ ~' z/ \4 k: v
zengyi703-16313 回答时间:2016-11-19 03:48:11
谢楼主分享
东方冰 回答时间:2017-5-9 19:51:15
谢谢分享!!
123下一页

所属标签

相似分享

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