|
想做一个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行的缓存。增加一行,删除一行。这样为了不增加内存,因为增加一行,会增加一次内存,最后内存会用完。
- hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_LISTVIEW0);
- LISTVIEW_AddRow(hItem, NULL);
-
- /* 序号 */
- sprintf(buf, "%d", s_uiCount);
- LISTVIEW_SetItemText(hItem, 0, s_uiCount, (const char *)buf);
-
- /* 标准ID */
- sprintf(buf, "%d",123);
- LISTVIEW_SetItemText(hItem, 1, s_uiCount, (const char *)buf);
- /* 接收到的数据 */
- sprintf(buf, "%d,%d,%d,%d,%d,%d,%d,%d", 0,0,0,0,0,0,0,0);
-
- LISTVIEW_SetItemText(hItem, 2, s_uiCount, (const char *)buf);
-
- /* 数据长度 */
- sprintf(buf, "%d", 0);
- LISTVIEW_SetItemText(hItem, 3, s_uiCount, (const char *)buf);
- /* 帧类型 */
- sprintf(buf, "%s", "BIG");
- LISTVIEW_SetItemText(hItem, 4, s_uiCount++, (const char *)buf);
- /* ListView添加新行后,保证一直显示最新行 */
- SCROLLBAR_SetValue(hScrollbar, SCROLLBAR_GetNumItems(hScrollbar));
- if(s_uiCount >=15) /*超过15行后,每增加一行,删除最初的一行(0,1,2.。。。)*/
- {
- hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_LISTVIEW0);
- ROWs_uiCount = s_uiCount-15;
- printf("LISTVIEW_GetNumRows = %d\r\n",ROWs_uiCount);
- LISTVIEW_DeleteRow(hItem, ROWs_uiCount);
- }
- /* 重启定时器 */
- WM_RestartTimer(pMsg->Data.v, 1000);
复制代码
但是,新增一行函数却不执行了。
似乎是 LISTVIEW_DeleteRow 之后不执行 LISTVIEW_AddRow 了。
|
|