硬汉嵌入式论坛

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

[emWin] 关于emwin 多行文本上下循环滚动显示问题

[复制链接]

14

主题

37

回帖

79

积分

初级会员

积分
79
发表于 2020-12-14 11:15:16 | 显示全部楼层 |阅读模式

想做一个emwin界面,界面显示类似串口打印效果。
最新行显示在最下方,循环显示。看到了论坛中有一个类似帖子,里面汉子哥建议使用listview控件。
http://www.armbbs.cn/forum.php?mod=viewthread&tid=94885

参考汉子哥的综合例程中的CAN数据收发。使用了listview控件。但是遇到一个问题:删除listview指定行之后(LISTVIEW_DeleteRow),LISTVIEW_AddRow(hItem, NULL);新增行就无法继续,
最终导致的结果就是,界面显示为空。

理论上想达到的效果是。总共给予15行缓存,超过15行,就删除第0行,到了第16行,删除第1行,一直维持在15行的缓存。增加一行,删除一行。这样为了不增加内存,因为增加一行,会增加一次内存,最后内存会用完。
  1.     hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_LISTVIEW0);       
  2.     LISTVIEW_AddRow(hItem, NULL);
  3.    
  4.     /* 序号 */
  5.     sprintf(buf, "%d", s_uiCount);
  6.     LISTVIEW_SetItemText(hItem, 0, s_uiCount, (const char *)buf);
  7.       
  8.     /* 标准ID */
  9.     sprintf(buf, "%d",123);
  10.     LISTVIEW_SetItemText(hItem, 1, s_uiCount, (const char *)buf);

  11.     /* 接收到的数据 */
  12.     sprintf(buf, "%d,%d,%d,%d,%d,%d,%d,%d", 0,0,0,0,0,0,0,0);
  13.    
  14.     LISTVIEW_SetItemText(hItem, 2, s_uiCount, (const char *)buf);
  15.   
  16.     /* 数据长度 */
  17.     sprintf(buf, "%d", 0);
  18.     LISTVIEW_SetItemText(hItem, 3, s_uiCount, (const char *)buf);

  19.     /* 帧类型 */
  20.     sprintf(buf, "%s", "BIG");
  21.     LISTVIEW_SetItemText(hItem, 4, s_uiCount++, (const char *)buf);

  22.     /* ListView添加新行后,保证一直显示最新行 */
  23.     SCROLLBAR_SetValue(hScrollbar, SCROLLBAR_GetNumItems(hScrollbar));      


  24. if(s_uiCount >=15)   /*超过15行后,每增加一行,删除最初的一行(0,1,2.。。。)*/
  25. {

  26. hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_LISTVIEW0);       

  27. ROWs_uiCount = s_uiCount-15;
  28. printf("LISTVIEW_GetNumRows = %d\r\n",ROWs_uiCount);       
  29. LISTVIEW_DeleteRow(hItem, ROWs_uiCount);

  30. }

  31.         /* 重启定时器 */
  32.     WM_RestartTimer(pMsg->Data.v, 1000);

复制代码


但是,新增一行函数却不执行了。
似乎是  LISTVIEW_DeleteRow        之后不执行       LISTVIEW_AddRow    了。
回复

使用道具 举报

14

主题

37

回帖

79

积分

初级会员

积分
79
 楼主| 发表于 2020-12-14 11:18:00 | 显示全部楼层
有无可以实现,增加新一行,删除旧的一行。既可以达到界面实时显示最新数据,又可以不因为增加新行导致 内存一直增加,最终死机
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115804
QQ
发表于 2020-12-14 13:01:59 | 显示全部楼层
我那个CAN那个例子是没问题的。
回复

使用道具 举报

14

主题

37

回帖

79

积分

初级会员

积分
79
 楼主| 发表于 2020-12-14 13:14:14 | 显示全部楼层
eric2013 发表于 2020-12-14 13:01
我那个CAN那个例子是没问题的。

对的,按照汉子哥你的can改了,没问题的。但是有一点是会一直增加内存的,每增加一个条目,会多占一点内存,数据多了,内存会被用完。

如果定时清空,因为它会整个界面都清空,体现不出实时显示效果,层层递进感
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115804
QQ
发表于 2020-12-15 08:33:30 | 显示全部楼层
ZMLZML1009 发表于 2020-12-14 13:14
对的,按照汉子哥你的can改了,没问题的。但是有一点是会一直增加内存的,每增加一个条目,会多占一点内 ...

变相的实现,可以试试。

整个清空后,直接添加末尾的几条信息。
回复

使用道具 举报

14

主题

37

回帖

79

积分

初级会员

积分
79
 楼主| 发表于 2020-12-15 09:03:17 | 显示全部楼层
eric2013 发表于 2020-12-15 08:33
变相的实现,可以试试。

整个清空后,直接添加末尾的几条信息。

好的,今天试试。昨天用TXT控件把这功能试了
回复

使用道具 举报

15

主题

74

回帖

119

积分

初级会员

积分
119
发表于 2020-12-15 15:43:56 | 显示全部楼层
第15行后
第16行数据来了 ,删除第0行,然后用LISTVIEW_AddRow添加一行,再添加新添加行的数据(此时显示的数据依旧是15行),
第17行数据来了,依旧删除0行,然后用LISTVIEW_AddRow添加一行,再添加新添加行的数据(此时显示的数据依旧是15行),
后边新来的数据都一样的。
即真实的数据永远只有15行,我工程就是用的这个方法, 没问题。sTemwin5.32版本
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
发表于 2020-12-17 08:22:03 | 显示全部楼层
ZMLZML1009 发表于 2020-12-15 09:03
好的,今天试试。昨天用TXT控件把这功能试了

//listview滚动显示
static void addListViewText(const char *text)
{
    static int cur_row = 0;

    LISTVIEW_AddRow(hListView, NULL);

    LISTVIEW_SetItemText(hListView, 0, cur_row, text);

    //若大于10行,则删除第0行,保持只显示最新10行数据
    if (cur_row >= 10) {
        LISTVIEW_DeleteRow(hListView, 0);
    }
    else {
        cur_row++;
    }

    /* ListView添加新行后,保证一直显示最新行 */
    hVScroll = WM_GetScrollbarV(hListView);
    SCROLLBAR_SetValue(hVScroll, SCROLLBAR_GetNumItems(hVScroll));
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-19 21:29 , Processed in 0.353990 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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