硬汉嵌入式论坛

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

[emWin] 在一个小屏幕上写了个界面,放了很多控件,不想用tab切换,还有其他方案吗?

[复制链接]

14

主题

36

回帖

14

积分

初级会员

积分
14
发表于 2014-11-21 15:13:48 | 显示全部楼层 |阅读模式
用的是物理按键,界面上放了Droplist和Edit控件,放了好几个,一般情况下,使用tab键来进行控件之间的切换。
由于控件太多,导致如果返回的话,需要按tab好几次,所以想用上下左右来模拟,
可是这种情况下会和Droplist的上下选择有冲突,该怎么办?


还有就是,假如有四个Droplist控件,用tab切换的时候,想让tab3始终不被选到,该如何实现?
​
​我建立了对话框后,WM_GetDialogItem()第三个droplist的句柄,
​接着用WM_DisableWindow()第三个,在用tab切换的时候还能被选到,啥情况?
​
​求教高手解答。
​
​以上
回复

使用道具 举报

14

主题

36

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2014-11-21 15:14:25 | 显示全部楼层
大神们,求教了啊啊啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106754
QQ
发表于 2014-11-21 23:04:41 | 显示全部楼层
能外接鼠标不,能外接鼠标就方便了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106754
QQ
发表于 2014-11-21 23:05:01 | 显示全部楼层
或者直接操作每个控件的句柄。
回复

使用道具 举报

14

主题

36

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2014-11-26 18:36:03 | 显示全部楼层

回 eric2013 的帖子

eric2013:能外接鼠标不,能外接鼠标就方便了。 (2014-11-21 23:04) 
额。。。不能接鼠标。。。
回复

使用道具 举报

14

主题

36

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2014-11-26 18:36:28 | 显示全部楼层

回 eric2013 的帖子

eric2013:或者直接操作每个控件的句柄。 (2014-11-21 23:05) 
这个通过消息拦截实现了,谢谢大神回复!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106754
QQ
发表于 2014-11-26 22:42:29 | 显示全部楼层

回 phyco 的帖子

phyco:这个通过消息拦截实现了,谢谢大神回复! (2014-11-26 18:36) 
好的。
回复

使用道具 举报

4

主题

11

回帖

4

积分

新手上路

积分
4
发表于 2014-12-1 00:38:23 | 显示全部楼层
来学习学习
回复

使用道具 举报

3

主题

5

回帖

3

积分

新手上路

积分
3
发表于 2014-12-8 13:03:21 | 显示全部楼层
请教怎么实现消息拦截啊?哪里有范例?
回复

使用道具 举报

2

主题

27

回帖

33

积分

新手上路

积分
33
发表于 2014-12-8 15:50:52 | 显示全部楼层
我也准备搞类似你的操作,楼主透露一下关键点嘛[s:138]
回复

使用道具 举报

14

主题

36

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2015-1-5 10:48:11 | 显示全部楼层

回 catcaptain 的帖子

catcaptain:
请教怎么实现消息拦截啊?哪里有范例?
消息分为生产者和消费者,如果要实现消息拦截,那么实际上的意思就是指定一个控件把这个消息消费了,比如选中Edit的时候,edit对GUI_KEY_ESC是不会有反应的,这个时候只需要加个判断条件让Edit消费ESC就可以了。例如:
  1. case WM_KEY:
  2.            Id    = WM_GetId(pMsg->hWinSrc);
  3.            if((Id >=  ID_EDIT_0) && (Id <=  ID_EDIT_3))
  4.            {
  5.                 if((((WM_KEY_INFO*)(pMsg->Data.p))->Key) == GUI_KEY_ESCAPE)
  6.                 {
  7.                         //do something
  8.                 }
  9.                 else if((((WM_KEY_INFO*)(pMsg->Data.p))->Key) == GUI_KEY_xxxxx)//EDIT不会消费的按键
  10.                 {
  11.                 }
  12.                 else
  13.                 {
  14.                     break;
  15.                 }
  16.             }
  17.   switch(((WM_KEY_INFO*)(pMsg->Data.p))->Key)
  18. {
  19.     //正常的消费
  20. }
复制代码
这是一种不会消费的情况,那么假如一个控件可以消费某个消息,只要在判断条件里让其他控件消费掉就可以了。//这种情况我还没有好好的的实验,如果有兴趣可以自己实验一下

还有一种方案是,对这个控件直接使用WM_DisableWindow()函数,这个函数的作用是让这个控件不能对触摸,按键,或者指针设备起反应,那么就不会消费消息了。
回复

使用道具 举报

14

主题

36

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2015-1-5 10:49:48 | 显示全部楼层

回 shichenxiao 的帖子

shichenxiao:我也准备搞类似你的操作,楼主透露一下关键点嘛[s:138]  (2014-12-08 15:50) 
我回复了其他的,你可以看下能否有帮助
回复

使用道具 举报

14

主题

36

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2015-1-5 10:58:16 | 显示全部楼层
额。。。为什么看不到坛子上的消息提醒。。。。。导致现在才看到回复。。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2015-1-5 11:46:55 | 显示全部楼层

回 phyco 的帖子

phyco:消息分为生产者和消费者,如果要实现消息拦截,那么实际上的意思就是指定一个控件把这个消息消费了,比如选中Edit的时候,edit对GUI_KEY_ESC是不会有反应的,这个时候只需要加个判断条件让Edit消费ESC就可以了。例如:case WM_KEY:
       &n .. (2015-01-05 10:48)
有2个问题:
1. “需要加个判断条件让Edit消费ESC就可以了”
岂不是要重新定义edit控件的回调函数? 在新的回调函数中处理escape按键消息? 你的代码是不是重定义的回调函数中的?

2 . ​用WM_DisableWindow()后,在用tab切换的时候还能被选到的。。。disable的控件还可以被选为焦点。。。但是不能编辑。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2015-1-5 12:07:40 | 显示全部楼层
我也碰到过类似的问题,是这么处理的。
1. 上下左右和droplist有冲突。方法:设置 droplist默认为disable的。只有被上下左右选中,按下enter键后,才能enable,然后上下就操作控件。再按enter键,disable控件,退出编辑。

2. 怎么不选择droplist3呢? 在窗口(对话框)回调函数的上下左右按键的消息中,判断当前的焦点,如果是droplist3,就多发一次tab的消息,这样子就跳过去了。

我目前用的这个方法,笨是笨了点,貌似还行。
回复

使用道具 举报

14

主题

36

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2015-1-6 09:20:07 | 显示全部楼层

回 caicaptain2 的帖子

caicaptain2:有2个问题:
1. “需要加个判断条件让Edit消费ESC就可以了”
岂不是要重新定义edit控件的回调函数? 在新的回调函数中处理escape按键消息? 你的代码是不是重定义的回调函数中的?

....... (2015-01-05 11:46) 
1.也可以这么理解。。相当于重新加入了一个按键,上面的就是在回调中,不用重新搞一个回调。

2.上面说disable是不能对指针,触摸,键盘等有反应,如果是不能被选中的话,用

WIDGET_AndState(hItem,WIDGET_STATE_FOCUSSABLE);
回复

使用道具 举报

14

主题

36

回帖

14

积分

初级会员

积分
14
 楼主| 发表于 2015-1-6 09:21:49 | 显示全部楼层

回 caicaptain2 的帖子

caicaptain2:我也碰到过类似的问题,是这么处理的。
1. 上下左右和droplist有冲突。方法:设置 droplist默认为disable的。只有被上下左右选中,按下enter键后,才能enable,然后上下就操作控件。再按enter键,disable控件,退出编辑。

2. 怎么不选择droplist3呢? 在窗口(对话框)回调函数 .. (2015-01-05 12:07)
这个方法确实是可以,在没有使用接口的情况下,这样做也很巧妙
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 10:05 , Processed in 0.263460 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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