硬汉嵌入式论坛

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

[emWin] 关于listview行显示自动复位问题

[复制链接]

98

主题

358

回帖

652

积分

金牌会员

积分
652
发表于 2021-12-17 17:08:01 | 显示全部楼层 |阅读模式
在12864屏幕上创建了一个大于屏幕的列表,并绑定一个垂直滚动条,每屏显示四行,并响应实体按键消息。
如下:
case  KEY_UP:    SCROLLBAR_AddValue(Emv.scro,-4); break;  
case  KEY_DOWN:  SCROLLBAR_AddValue(Emv.scro,4);  break;
case        KEY_LEFT:        GUI_StoreKeyMsg(GUI_KEY_LEFT,1); break;
case        KEY_RIGHT:        GUI_StoreKeyMsg(GUI_KEY_RIGHT,1); break;
发现一个现象,上下翻页正常,但每次响应左右按键时当前的行都会自动返回到第一行(当然列表也确实左右移动了)。
但是如果把上下按键的响应代码改成如下:
case  KEY_UP:                               
for( i=0; i<4; i++ )
{
GUI_StoreKeyMsg(GUI_KEY_UP,1);
}
break;
case  KEY_DOWN:                                                 
for( i=0; i<4; i++ )
{
GUI_StoreKeyMsg(GUI_KEY_DOWN,1);
}
break;
左右翻页时就不再复归到第一行了。但这样其实是实现不了翻页的效果的,比如一开始显示0123行,响应一次下键后,虽然已经选中第4行,但页面显示的却是3456行.
而用滚动条的方式是可以实现翻页的效果。一开始显示0123行,响应一次后就会显示4567行。
于是又尝试给列表绑定一个水平滚动条,然后在左右按键里面直接操作水平滚动条,发现也会复归到第一行。
怀疑EMWIN响应左右按键或者水平滚动条消息的时候,都按照当前选择的行去重新定位显示了,因为仅操作滚动条去上下滚动或者左右滚动,实际选择的其实一直是第一行。
不知道这是不是EMWIN对实体按键响应的一个BUG,暂时记录下,请教硬汉哥是否遇到过类似情况?
回复

使用道具 举报

98

主题

358

回帖

652

积分

金牌会员

积分
652
 楼主| 发表于 2021-12-17 17:20:43 | 显示全部楼层
暂时通过以下方式实现上下翻页的效果,左右移动时行又不自动复位的目的
        case  KEY_UP:   
                                {
                                        SCROLLBAR_AddValue(Emv.scro,-4);
                                        i = SCROLLBAR_GetValue(Emv.scro);
                                        LISTVIEW_SetSel(Emv.listview,i);                       
                                        break;
                                }                                 
        case  KEY_DOWN:  
                                {
                                        SCROLLBAR_AddValue(Emv.scro,4);
                                        i = SCROLLBAR_GetValue(Emv.scro);
                                        LISTVIEW_SetSel(Emv.listview,i);               
                                        break;
                                }               
                                case        KEY_LEFT:       
                                {
                                        GUI_StoreKeyMsg(GUI_KEY_LEFT,1);
                                        break;
                                }
                                case        KEY_RIGHT:       
                                {
                                        GUI_StoreKeyMsg(GUI_KEY_RIGHT,1);
                                        break;
                                }
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115834
QQ
发表于 2021-12-17 19:31:00 | 显示全部楼层
谢谢楼主分享。

listview有时候有自动适配显示行位置的问题,虽然我们滚动条调节了,但它还是会微调一下,不知道你楼主位说的是不是类似这种现象。
回复

使用道具 举报

98

主题

358

回帖

652

积分

金牌会员

积分
652
 楼主| 发表于 2021-12-17 21:37:06 | 显示全部楼层
eric2013 发表于 2021-12-17 19:31
谢谢楼主分享。

listview有时候有自动适配显示行位置的问题,虽然我们滚动条调节了,但它还是会微调一下 ...

嗯,差不多这个意思,响应GUI_KEY_UP和GUI_KEY_DOWN按键消息就是这个效果,感觉它只保证所选行在可视页面内,并不保证选择的行永远显示在屏幕的最上方。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115834
QQ
发表于 2021-12-19 08:40:07 | 显示全部楼层
云琴箫龙 发表于 2021-12-17 21:37
嗯,差不多这个意思,响应GUI_KEY_UP和GUI_KEY_DOWN按键消息就是这个效果,感觉它只保证所选行在可视页面 ...

我之前的解决办法是调整可视区和单元格的高度正好适配。这样他就不会自动调节了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-21 16:00 , Processed in 0.341590 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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