硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2674|回复: 15
收起左侧

[emWin] 如何设置非经典皮肤的BUTTON控件,在获得输入焦点时的外观变化

[复制链接]

3

主题

56

回帖

65

积分

初级会员

积分
65
发表于 2019-8-15 17:02:15 | 显示全部楼层 |阅读模式
如题,我的按键设置了自定义回调函数,并为它绘制了BMP图,现在我想通过外置的硬件键盘,按下TAB键时传递GUI_KEY_TAB消息给EMWIN,告诉界面需要切换焦点控件了,这部分功能现在已经实现了。问题是:1.我发现被我设置过自定义回调函数的按键,再获取到输入焦点时,外观上是没有任何变化的,我看不出来它到底有没有获得输入焦点。
2.小弟尝试了设置皮肤函数(这种情况下没有设置按键的自定义回调,全部采用EMWIN默认的处理),并处理皮肤回调函数中的WIDGET_ITEM_DRAW_FOCUS消息,可是我发现不论该按键有没有获得焦点,这条消息下的函数都会执行。

问题如上,特来请教,谢谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107145
QQ
发表于 2019-8-15 17:26:52 | 显示全部楼层
看我们emWin教程的皮肤色章节
http://www.armbbs.cn/forum.php?m ... 9834&extra=page%3D1
然后给聚焦状态设置一种颜色:

QQ截图20190815173043.jpg
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-8-15 17:42:44 | 显示全部楼层
eric2013 发表于 2019-8-15 17:26
看我们emWin教程的皮肤色章节
http://www.armbbs.cn/forum.php?m ... 9834&extra=page%3D1
然后给聚焦状 ...

汉哥,这个方法我刚试了,如果不给按键设置皮肤,且不设置自定义回调函数,是可以改变聚焦态的颜色,不过我的按键做了自定义回调,对WM_PAINT消息做了操作,这样情况下,设置皮肤色的方式不起作用
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107145
QQ
发表于 2019-8-16 00:56:31 | 显示全部楼层
溪云初_VS28s 发表于 2019-8-15 17:42
汉哥,这个方法我刚试了,如果不给按键设置皮肤,且不设置自定义回调函数,是可以改变聚焦态的颜色,不过 ...

你楼主说的问题1,试试在自定义回调函数里面调用下获取聚焦状态的API,看看能正确区分不
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-8-16 16:24:24 | 显示全部楼层
eric2013 发表于 2019-8-16 00:56
你楼主说的问题1,试试在自定义回调函数里面调用下获取聚焦状态的API,看看能正确区分不

汉哥,这样可以正确区分,并且能画出来。我的按键自定义回调函数的PAINT处理部分如下:
                case WM_PAINT:
                        GUI_SetColor(GUI_BLUE);
                        GUI_SetBkColor(GUI_BLUE);
                        GUI_DrawRect(0,0,10 ,10);
                        GUI_Clear();

                        if(WM_GetFocussedWindow() == pMsg->hWin)
                        {
                                GUI_SetBkColor(GUI_YELLOW);
                                GUI_Clear();
                        }
                        break;
但是同时我的按键是圆角矩形裁边的,这样还是得通关皮肤函数来实现
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-8-16 16:34:15 | 显示全部楼层
eric2013 发表于 2019-8-16 00:56
你楼主说的问题1,试试在自定义回调函数里面调用下获取聚焦状态的API,看看能正确区分不

问题解决了。汉哥真是厉害,准备知道问题的关键是皮肤函数内部的WIDGET_ITEM_DRAW_FOCUS消息,是无法确定控件是否获得输入焦点的。也就是说,不论控件有没有获得输入焦点,GUI_Delay等函数都会执行一遍WIDGET_ITEM_DRAW_FOCUS,那么我在这个消息内部加上if判断输入焦点的句柄是否为当前控件,if判断城里的话才执行绘制,就实现了我需要的功能。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107145
QQ
发表于 2019-8-17 01:21:40 | 显示全部楼层
溪云初_VS28s 发表于 2019-8-16 16:24
汉哥,这样可以正确区分,并且能画出来。我的按键自定义回调函数的PAINT处理部分如下:
                case WM_PAINT ...

圆形裁剪,自定义回调即可,使用皮肤回调也没有问题。
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-8-18 19:38:22 | 显示全部楼层
eric2013 发表于 2019-8-17 01:21
圆形裁剪,自定义回调即可,使用皮肤回调也没有问题。

嗯嗯,这个问题算是解决了。汉哥,有个新问题,EMWIN的GRAPH控件现在最新版本支持float类型数据了吗?或者在3.98版本源码基础上,自己修改源码是否可行呢,这几天在看源码,GUI_ALLOC_h2p             (GUI_HMEM  hMem);这个函数始终没找到源码。汉哥能否粗略帮忙讲一下,实现这个功能,思路是什么样子的。我第一次看源码,感觉有点云里雾里
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107145
QQ
发表于 2019-8-19 09:15:25 | 显示全部楼层
溪云初_VS28s 发表于 2019-8-18 19:38
嗯嗯,这个问题算是解决了。汉哥,有个新问题,EMWIN的GRAPH控件现在最新版本支持float类型数据了吗?或 ...

api本身不支持浮点值,就用整数表示做个比例关系表示浮点就行。
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-8-19 15:57:27 | 显示全部楼层
eric2013 发表于 2019-8-19 09:15
api本身不支持浮点值,就用整数表示做个比例关系表示浮点就行。

产品希望把刻度做成能缩放的方式,我需要自己做一个float类型到I16类型的映射,把他要的浮点数值虚拟出来。毕竟用GRAPH控件,就算底层源码改成支持浮点了,EMWIN最终发送给物理屏幕的显示坐标,也还是真是的整数坐标点,所以区别只是这个“翻译”工作由哪部分程序来做。我这样理解对不
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-8-19 21:37:54 | 显示全部楼层
eric2013 发表于 2019-8-19 09:15
api本身不支持浮点值,就用整数表示做个比例关系表示浮点就行。

彻底无语了,老板一定要我改3.98版本的代码出来,一定要改源码到GRAPH控件支持Float型DATA和SCALE。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107145
QQ
发表于 2019-8-20 08:50:11 | 显示全部楼层
溪云初_VS28s 发表于 2019-8-19 21:37
彻底无语了,老板一定要我改3.98版本的代码出来,一定要改源码到GRAPH控件支持Float型DATA和SCALE。。。

自己在整形的基础上封装一个。
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-8-23 12:03:20 | 显示全部楼层
eric2013 发表于 2019-8-20 08:50
自己在整形的基础上封装一个。

汉哥,我在3.98版本源码上改了一个出来,目前在调试,整理好之后我发到论坛来
回复

使用道具 举报

19

主题

311

回帖

368

积分

高级会员

积分
368
发表于 2019-8-24 14:54:57 | 显示全部楼层
我们都是放大100、1000倍当整数处理,显示用类似  /100 %100
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-8-30 14:45:59 | 显示全部楼层
eric2013 发表于 2019-8-20 08:50
自己在整形的基础上封装一个。

汉哥,问个其他问题,有没有uC/OSIII上面跑多任务调用GUI的示例工程,我现在创建了三个任务,一个是TP扫描,一个是GUI_Delay();另一个是创建了一个TEXT,在while里面合成字符串,设置TEXT的文本,现在下载完全黑屏,调试会进入硬Fault,GUI_Delay的任务优先级给的10,其他两个是8.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107145
QQ
发表于 2019-8-31 01:23:01 | 显示全部楼层
溪云初_VS28s 发表于 2019-8-30 14:45
汉哥,问个其他问题,有没有uC/OSIII上面跑多任务调用GUI的示例工程,我现在创建了三个任务,一个是TP扫 ...

早年有,后来不做了,效果不好,神奇问题比多。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-20 11:31 , Processed in 0.368222 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表