硬汉嵌入式论坛

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

[emWin] SWIPELIST删除Item后Item位置自动对齐但附着在其上的小部件位置错乱

[复制链接]

4

主题

25

回帖

37

积分

新手上路

积分
37
发表于 2020-4-3 11:23:56 | 显示全部楼层 |阅读模式
SWIPELIST删除Item后Item位置自动对齐但附着在其上的小部件位置错乱,
Video_2020-04-03_080154[00-00-00--00-00-25].gif
Video_2020-04-03_080918[00-00-26--00-00-56].gif

情况大概就是上面这两个GIF这样的情况,我简单的描述一下。
创建SWIPELIST的代码如下:
  1. hSwpParent = WM_CreateWindowAsChild(0, 0, xSize/2, ySize, WM_HBKWIN, WM_CF_SHOW | WM_CF_MEMDEV | WM_CF_HASTRANS, _cbParent, 0);
  2.         hSwpLst = SWIPELIST_CreateEx(1, 1, xSize / 2-40, ySize - 1, hSwpParent, WM_CF_SHOW | WM_CF_MOTION_Y | WM_CF_HASTRANS, 0, GUI_ID_SWIPELIST0);
  3.         //
  4.         //以下代码用来配置swipelist 的相关参数
  5.         //

  6.         SWIPELIST_AddSepItem(hSwpLst, "living room", 40);
  7.         SWIPELIST_SetBkColor(hSwpLst, SWIPELIST_CI_BK_SEP_ITEM,GUI_RED);
  8.         //SWIPELIST_SetBkColor(hSwpLst, SWIPELIST_CI_BK_ITEM_UNSEL, GUI_TRANSPARENT);
  9.         for (i = 0; i < 7; i++) {
  10.                 sprintf(text, "Room%d", i);
  11.                 SWIPELIST_AddItem(hSwpLst, (const char*)text, 40);
  12.                 //_ahText[i] = TEXT_CreateEx(0, 0, 50, 39, hSwpParent, WM_CF_SHOW, 0, USER_ID_TEXT + i, "3癈");
  13.                 //TEXT_SetTextAlign(_ahText[i], TEXT_CF_VCENTER | TEXT_CF_HCENTER);
  14.                 //TEXT_SetBkColor(_ahText[i], GUI_GRAY);
  15.                 //TEXT_SetFont(_ahText[i], GUI_FONT_16B_1);

  16.                 _ahText[i] = BUTTON_CreateEx(0, 0, 40, 20, hSwpParent, WM_CF_SHOW, 0, USER_ID_TEXT + i);
  17.                 BUTTON_SetBkColor(_ahText[i], BUTTON_CI_UNPRESSED, GUI_BLUE);
  18.                 SWIPELIST_ItemAttachWindow(hSwpLst, i + 1, _ahText[i], 138, 0);
  19.         }
  20.         hButton = BUTTON_CreateEx(203, 5, 35, 20, hSwpParent, WM_CF_SHOW | WM_CF_HASTRANS, 0, GUI_ID_BUTTON0);
  21.         BUTTON_SetText(hButton, "Del");
复制代码


创建了一个按钮当按钮松开的时候就SWIPLIST_DeleteItem()来删除一个Item这里固定删除的是ItemIndex为3的Item。
但是删除了Item后Item会自动对齐,附着在Item上的窗口却不会跟着Item一起对齐?我认为是删除后需要重绘窗口于是我就WM_InvalidateWindow了SwipeList的窗口和其父窗口发现并没有用,甚至我把每个附着的小窗口句柄都给记录下来并重绘这些附着小窗口但还是位置不正确。
我们知道当删除Item的时候其附着的小窗口也将被删除在发送重绘命令的时候也做了处理。
  1. case WM_NOTIFICATION_RELEASED:
  2.                         switch (ID) {
  3.                         case GUI_ID_BUTTON0 :
  4.                                 hSwp = WM_GetDialogItem(pMsg->hWin, GUI_ID_SWIPELIST0);
  5.                                 SWIPELIST_DeleteItem(hSwp,3);

  6.                                 WM_InvalidateWindow(hSwpLst);
  7.                                 WM_InvalidateWindow(hSwpParent);
  8.                                 for (i = 0; i < 11; i++) {
  9.                                         if ((_ahText[i] != 0) && (WM_IsWindow(_ahText[i]))) {
  10.                                                 WM_InvalidateWindow(_ahText[i]);
  11.                                                 
  12.                                         }
  13.                                 }

  14.                                 break;
复制代码
但是 附着小窗口 位置不动的时候滑动一下SWIPELIST他窗口就正确了。但是超出屏幕的窗口又不能显示了。不知道是我哪里没有理解对。有大佬能指点一下么?

回复

使用道具 举报

4

主题

25

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2020-4-3 13:51:25 | 显示全部楼层
后来我又想到了一种方法:删除Item后把所有“附着小窗口”都给Detach然后再重新附着上Item。立马安排上。
  1.    switch (ID) {
  2.                         case GUI_ID_BUTTON0 :
  3.                                 hSwp = WM_GetDialogItem(pMsg->hWin, GUI_ID_SWIPELIST0);
  4.                                 SWIPELIST_DeleteItem(hSwpLst,3);
  5.                                 for (i = 0; i < 11; i++) {
  6.                                         if ((_ahText[i] != 0) && (WM_IsWindow(_ahText[i]))) {
  7.                                                 SWIPELIST_ItemDetachWindow(hSwpLst, _ahText[i]);
  8.                                         }
  9.                                 }
  10.                                 WM_InvalidateWindow(hSwpLst);
  11.                                 WM_InvalidateWindow(hSwpParent);
  12.                                 for (i = 0; i < 11; i++) {
  13.                                         if ((_ahText[i] != 0) && (WM_IsWindow(_ahText[i]))) {
  14.                                                 //WM_InvalidateWindow(_ahText[i]);
  15.                                                 cnt++;
  16.                                                 SWIPELIST_ItemAttachWindow(hSwpLst, cnt, _ahText[i], 138, 10);
  17.                                         }
  18.                                         //hSwpItem = SWIPELIST_GetReleasedItem
  19.                                 }

  20.                                 break;
  21.                         }
复制代码
非常遗憾,并没有什么用。但有一点就是删除Item后“附着窗口”能够跟随Item移动。但之前没有在屏幕内的“附着窗口”仍然不会显示出来。可能这个是STemWin的Bug吧?
Video_2020-04-03_134805[00-00-00--00-00-21].gif
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-4-3 18:27:52 | 显示全部楼层
帮顶下,没有研究过这个控件。
回复

使用道具 举报

4

主题

25

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2020-4-22 14:34:02 | 显示全部楼层
Video_2020-04-17_231311[00-00-00--00-00-25].gif

解决了,详细原理如
https://blog.csdn.net/yconnor/article/details/105565713
所示。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-4-22 15:07:46 | 显示全部楼层
yconnor 发表于 2020-4-22 14:34
解决了,详细原理如
所示。

感谢告知最后的解决办法。
回复

使用道具 举报

4

主题

25

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2020-4-23 07:39:15 | 显示全部楼层
eric2013 发表于 2020-4-22 15:07
感谢告知最后的解决办法。

不过解决的方法有点傻傻的。应该还有更好的方法的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 19:39 , Processed in 0.245318 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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