硬汉嵌入式论坛

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

[emWin] 看论坛里没几个swipelist的例程,发一个简单易用的

[复制链接]

20

主题

110

回帖

170

积分

初级会员

积分
170
发表于 2020-6-29 16:24:51 | 显示全部楼层 |阅读模式
本帖最后由 飛饵 于 2020-6-30 20:21 编辑

捣鼓了下SWIPELIST控件,刚开始做了个简单的来测试,删除窗口,结束对话框什么的都正常。然后继续加了很多子控件和配置上去,结果就出现冲突了。现在删掉一些保留最开始的那个还是不行,不知道出了什么问题。


------------------------------------------------------------------------ 问题解决转为分享 -------------------------------------------------------------------------
简单易用,效果也不错,F407上实测非常流畅。从 _cbDialog() 函数从头到尾看一遍就能知道这控件的配置过程
  1. #include <stdio.h>
  2. #include "DIALOG.h"
  3. #include "SWIPELIST.h"

  4. /*
  5. *------------------ 宏 定 义 ----------------------------------------------------------
  6. *--------------------------------------------------------------------------------------
  7. */
  8. #define ID_WINDOW_0         (GUI_ID_USER + 0x00)
  9. #define ID_SWIPELIST_0                (GUI_ID_USER + 0x01)
  10. #define ID_BUTTON_0                        (GUI_ID_USER + 0x02)
  11. #define ID_RADIO_0                        (GUI_ID_USER + 0x03)
  12. #define ID_RADIO_1                        (GUI_ID_USER + 0x04)
  13. #define ID_RADIO_2                        (GUI_ID_USER + 0x05)
  14. #define ID_SLIDER_0                        (GUI_ID_USER + 0x06)

  15. /*
  16. *------------------ 静 态 数 据 --------------------------------------------------------
  17. *--------------------------------------------------------------------------------------
  18. */
  19. /*
  20. *----------- 窗口控件数据数组 -------------
  21. *
  22. *
  23. */
  24. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  25.   {WINDOW_CreateIndirect,        "SettingWindow", ID_WINDOW_0,    0, 0, 320, 240, 0, 0x64, 0},
  26.   {SWIPELIST_CreateIndirect,        "Swipelist",             ID_SWIPELIST_0, 0, 30, 320, 210, 0, 0x0, 0},
  27.   {BUTTON_CreateIndirect,        "Back",          ID_BUTTON_0,    0, 0, 50, 30, 0, 0x0, 0},
  28. };



  29. /*
  30. *------------------ 用 户 代 码 数 据 --------------------------------------------------
  31. *--------------------------------------------------------------------------------------
  32. */
  33. /*
  34. *----------- 全局变量引用 -------------
  35. *
  36. *
  37. */
  38. //extern GUI_CONST_STORAGE GUI_BITMAP bm_icon_bl_highest;
  39. //extern GUI_CONST_STORAGE GUI_BITMAP bm_icon_bl_middle;
  40. //extern GUI_CONST_STORAGE GUI_BITMAP bm_icon_bl_lowest;
  41. //extern GUI_CONST_STORAGE GUI_BITMAP bm_icon_setting_return_prs;
  42. //extern GUI_CONST_STORAGE GUI_BITMAP bm_icon_setting_return_unprs;

  43. /*
  44. *----------- 窗口背景回调函数 -------------
  45. * 形参:*pMsg:消息指针
  46. *
  47. * 说明:绘制窗口的背景
  48. */
  49. static void _cbBkWindows(WM_MESSAGE *pMsg)
  50. {
  51.         WM_HWIN hItem, hAttachItem;
  52.         int Id, NCode;

  53.         switch(pMsg->MsgId)
  54.         {
  55.                 case WM_NOTIFY_PARENT:
  56.                         Id = WM_GetId(pMsg->hWinSrc);
  57.                         NCode = pMsg->Data.v;
  58.                         switch (Id)
  59.                         {
  60.                                 case  ID_BUTTON_0:
  61.                                         switch (NCode)
  62.                                         {
  63.                                                 case WM_NOTIFICATION_RELEASED:
  64.                                                         WM_HideWindow(pMsg->hWin);
  65.                                                 break;
  66.                                         }
  67.                                 break;
  68.                         }
  69.                 break;

  70.                 case WM_PAINT:
  71.                         GUI_SetBkColor(0x002B2F17);
  72.                         GUI_Clear();
  73.                         GUI_SetFont(&GUI_Font24B_ASCII);
  74.                         GUI_DispStringAt("Settings", 50, 2);
  75.                 break;

  76.                 default:
  77.                         WM_DefaultProc(pMsg);
  78.                 break;
  79.         }
  80. }

  81. /*
  82. *----------- 滑动列表子控件回调函数 -------------
  83. * 形参:*pMsg:消息指针
  84. *
  85. * 说明:滑动列表上子控件的部分消息处理都在此回调中进行
  86. */
  87. static void _cbSwipeItems(WM_MESSAGE *pMsg)
  88. {
  89.         WM_HWIN hItem;
  90.         int Id, NCode;

  91.         switch (pMsg->MsgId)
  92.         {
  93.                 case WM_NOTIFY_PARENT:
  94.                         Id = WM_GetId(pMsg->hWinSrc);
  95.                         NCode = pMsg->Data.v;
  96.                         switch (Id)
  97.                         {
  98.                                 case ID_RADIO_0:
  99.                                         switch (NCode)
  100.                                         {
  101.                                         }
  102.                                 break;

  103.                                 case ID_RADIO_1:
  104.                                         hItem = WM_GetDialogItem(pMsg->hWin, ID_RADIO_1);
  105.                                         switch (NCode)
  106.                                         {
  107.                                                 case WM_NOTIFICATION_VALUE_CHANGED:
  108.                                                         //
  109.                                                         //
  110.                                                         //
  111.                                                 break;
  112.                                         }
  113.                                 break;

  114.                                 case ID_RADIO_2:
  115.                                         hItem = WM_GetDialogItem(pMsg->hWin, ID_RADIO_2);
  116.                                         switch (NCode)
  117.                                         {
  118.                                                 case WM_NOTIFICATION_VALUE_CHANGED:
  119.                                                         //
  120.                                                         //
  121.                                                         //
  122.                                                 break;
  123.                                         }
  124.                                 break;

  125.                                 case ID_SLIDER_0:
  126.                                         hItem = WM_GetDialogItem(pMsg->hWin, ID_SLIDER_0);
  127.                                         switch (NCode)
  128.                                         {
  129.                                                 case WM_NOTIFICATION_CLICKED:
  130.                                                         WM_MOTION_Enable(0); //选中控件时禁止滑动
  131.                                                 break;

  132.                                                 case WM_NOTIFICATION_RELEASED:
  133.                                                         WM_MOTION_Enable(1); //送手开启滑动
  134.                                                 break;

  135.                                                 case WM_NOTIFICATION_VALUE_CHANGED:
  136.                                                         //
  137.                                                         //
  138.                                                         //
  139.                                                 break;
  140.                                         }
  141.                                 break;
  142.                                 
  143.                         }
  144.                 break;

  145.                 default:
  146.                         SWIPELIST_Callback(pMsg);
  147.                 break;
  148.         }
  149. }

  150. /*
  151. *----------- 设置界面返回按钮回调函数 -------------
  152. * 形参:*pMsg:消息指针
  153. *
  154. * 返回:
  155. * 说明:主要用来绘制位图
  156. */
  157. static void _cbButtonBack(WM_MESSAGE *pMsg)
  158. {
  159.         switch (pMsg->MsgId)
  160.         {
  161.                 case WM_PAINT:
  162.                         if(BUTTON_IsPressed(pMsg->hWin)) //按钮按下状态
  163.                         {
  164.                                 //GUI_DrawBitmap(&bm_icon_setting_return_prs, 0, 0);
  165.                                 GUI_SetColor(GUI_RED);
  166.                                 GUI_DispStringAt("pressed", 5, 10);
  167.                         }
  168.                         else //未按下状态
  169.                         {
  170.                                 //GUI_DrawBitmap(&bm_icon_setting_return_unprs, 0, 0);
  171.                                 GUI_SetColor(GUI_WHITE);
  172.                                 GUI_DispStringAt("unpressed", 0, 10);
  173.                         }
  174.                 break;

  175.                 default:
  176.                         BUTTON_Callback(pMsg);
  177.                 break;
  178.         }

  179. }

  180. /*
  181. *------------------ 系 统 回 调 函 数 --------------------------------------------------
  182. *--------------------------------------------------------------------------------------
  183. */
  184. /*
  185. *----------- 窗口回调函数 -------------
  186. * 形参:*pMsg:消息指针
  187. *
  188. * 说明:整个界面的主回调函数
  189. */
  190. static void _cbDialog(WM_MESSAGE *pMsg)
  191. {
  192.         WM_HWIN hItem, hAttachItem;
  193.         int Id, NCode;
  194.         char str[30];

  195.         switch (pMsg->MsgId)
  196.         {
  197.                 case WM_INIT_DIALOG:
  198.                         /*设置窗口背景回调*/                        
  199.                         WM_SetCallback(pMsg->hWin, _cbBkWindows);
  200.                         /*设置设置返回按钮回调*/
  201.                         hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
  202.                         WM_SetCallback(hItem, _cbButtonBack);

  203.                         /*Swipelist初始化*/
  204.                         hItem = WM_GetDialogItem(pMsg->hWin, ID_SWIPELIST_0);
  205.                         WM_SetCallback(hItem, _cbSwipeItems); //子控件回调
  206.                         WM_MOTION_SetMoveable(hItem, WM_CF_MOTION_Y, 1); //给滑动列表打开移动功能
  207.                         SWIPELIST_SetFont(hItem, SWIPELIST_FI_ITEM_HEADER, &GUI_Font16B_ASCII); //设置字体
  208.                         SWIPELIST_SetFont(hItem, SWIPELIST_FI_ITEM_TEXT, &GUI_Font16B_ASCII);
  209.                         SWIPELIST_SetBkColor(hItem, SWIPELIST_CI_BK_ITEM_UNSEL, 0x00444A24); //设置背景颜色
  210.                         SWIPELIST_SetBkColor(hItem, SWIPELIST_CI_BK_ITEM_SEL, 0x00535B2D);
  211.                         SWIPELIST_SetTextColor(hItem, SWIPELIST_CI_SEP_ITEM_TEXT, 0x002B2F17); //设置分隔符项目文本的颜色
  212.                         SWIPELIST_SetTextColor(hItem, SWIPELIST_CI_ITEM_HEADER_UNSEL, GUI_WHITE); //设置表头文本(第一个文本)的颜色
  213.                         SWIPELIST_SetTextColor(hItem, SWIPELIST_CI_ITEM_HEADER_SEL, GUI_WHITE);
  214.                         SWIPELIST_SetTextColor(hItem, SWIPELIST_CI_ITEM_TEXT_UNSEL, GUI_WHITE); //设置描述文本(除了第一个的下面的文本)的颜色
  215.                         SWIPELIST_SetTextColor(hItem, SWIPELIST_CI_ITEM_TEXT_SEL, GUI_WHITE);

  216.                         /*添加列表项目和项目的选项及文本*/
  217.                         /*分隔项目0*/
  218.                         SWIPELIST_AddSepItem(hItem, "  Sep0", 20); //项目,并添加分隔符项目文本
  219.                         SWIPELIST_AddItem(hItem, "   Item1 - text0", 70);        //项目里的选项,并设置表头文本
  220.                         SWIPELIST_AddItemText(hItem, 1, " "); //添加选项描述文本
  221.                         SWIPELIST_AddItemText(hItem, 1, "   Item1 - text1");
  222.                         /*分隔项目1*/
  223.                         SWIPELIST_AddSepItem(hItem, "  Sep1", 20);
  224.                         SWIPELIST_AddItem(hItem, "   Item3 - text0", 160);
  225.                         SWIPELIST_AddItemText(hItem, 3, " ");
  226.                         SWIPELIST_AddItemText(hItem, 3, "   Item3 - text2");
  227.                         SWIPELIST_AddItemText(hItem, 3, " ");
  228.                         SWIPELIST_AddItemText(hItem, 3, "   Item3 - text4");
  229.                         SWIPELIST_AddItemText(hItem, 3, " ");
  230.                         SWIPELIST_AddItemText(hItem, 3, "   Item3 - text6");
  231.                         SWIPELIST_AddItemText(hItem, 3, "   Item3 - text7");
  232.                         SWIPELIST_AddItem(hItem, "   Item4 - text0", 90);
  233.                         SWIPELIST_AddItemText(hItem, 4, " ");
  234.                         SWIPELIST_AddItemText(hItem, 4, "   Item4 - text2");
  235.                         SWIPELIST_AddItemText(hItem, 4, "   Item4 - text3");
  236.                         /*分隔项目2*/
  237.                         SWIPELIST_AddSepItem(hItem, "  Sep2", 20);
  238.                         SWIPELIST_AddItem(hItem, "   Item6 - text0", 50);
  239.                         
  240.                         /*往列表添加子控件*/
  241.                         /*
  242.                                 注意,SWIPELIST_ItemAttachWindow函数的第二个参数,索引值是从0开始,子控件在每个项目
  243.                                 中的索引值按顺序递增,在下一个项目中的第一个子控件索引要额外及加1,因为分隔符项目也占用一个索引。
  244.                                 比如,Sep0中子控件索引值为1,到了Sep1中,第一个子控件的索引值不是2而是3,第二个子控件则依然按顺序递增为4。
  245.                         */
  246.                         /*Sep0子控件-Item1*/
  247.                         hAttachItem = RADIO_CreateEx(0, 0, 20, 50, pMsg->hWin, WM_CF_SHOW, 0, ID_RADIO_0, 2, 32);
  248.                         SWIPELIST_ItemAttachWindow(hItem, 1, hAttachItem, 280, 12);
  249.                         /*Sep1子控件-Item3*/
  250.                         hAttachItem = RADIO_CreateEx(0, 0, 20, 120, pMsg->hWin, WM_CF_SHOW, 0, ID_RADIO_1, 4, 33);
  251.                         SWIPELIST_ItemAttachWindow(hItem, 3, hAttachItem, 280, 16);
  252.                         /*Sep1子控件-Item4*/
  253.                         hAttachItem = RADIO_CreateEx(0, 0, 20, 50, pMsg->hWin, WM_CF_SHOW, 0, ID_RADIO_2, 2, 31);
  254.                         SWIPELIST_ItemAttachWindow(hItem, 4, hAttachItem, 280, 15);
  255.                         /*Sep2子控件-Item6*/
  256.                         hAttachItem = SLIDER_CreateEx(0, 0, 200, 20, pMsg->hWin, WM_CF_SHOW        , 0, ID_SLIDER_0);
  257.                         SWIPELIST_ItemAttachWindow(hItem, 6, hAttachItem, 100, 20);
  258. //                        SWIPELIST_SetBitmap(hItem, 6, SWIPELIST_BA_LEFT | SWIPELIST_BA_BOTTOM, &bm_icon_bl_highest); //显示图标

  259.                         SLIDER_SetRange(hAttachItem, 300, 1799);
  260.                         SLIDER_SetNumTicks(hAttachItem, 0); //不显示数值标记
  261.                         SLIDER_EnableFocusRect(hAttachItem, 0); //不显示聚焦虚线框
  262.                         SLIDER_SetWidth(hAttachItem, 15); //滑块大小
  263.                 break;
  264.         
  265.                 case WM_PAINT:
  266.                         
  267.                 break;

  268.                 default:
  269.                         WM_DefaultProc(pMsg);
  270.                 break;
  271.         }



  272. }

  273. /*
  274. *------------------ 公 共 代 码 --------------------------------------------------
  275. *--------------------------------------------------------------------------------
  276. */
  277. /*
  278. *----------- 创建窗口函数 -------------
  279. * 形参:无
  280. *
  281. * 说明:无
  282. */
  283. WM_HWIN CreateSettingWindow(void);
  284. WM_HWIN CreateSettingWindow(void) {
  285.   WM_HWIN hWin;

  286.   hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  287.   return hWin;
  288. }



复制代码
模拟器截图:
QQ截图20200630201658.png
SettingWindowDLGnew.c (9.09 KB, 下载次数: 19)
回复

使用道具 举报

20

主题

110

回帖

170

积分

初级会员

积分
170
 楼主| 发表于 2020-6-30 01:49:05 | 显示全部楼层
eric2013 发表于 2020-6-30 00:56
嗯,对比排查下你的工程问题。

搞半天原来是模拟器用的5.32库有问题,单片机上的正常。模拟器升级到5.42就正常了,看来以后出什么问题要第二个怀疑是库的bug
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-6-29 16:56:34 | 显示全部楼层
模拟器里面找个案例跑跑。
回复

使用道具 举报

20

主题

110

回帖

170

积分

初级会员

积分
170
 楼主| 发表于 2020-6-29 19:20:51 | 显示全部楼层
eric2013 发表于 2020-6-29 16:56
模拟器里面找个案例跑跑。

模拟器案例没问题啊?
怀疑是没删除列表上子控件造成的,但试了下还是一样,不管删没删子控件只要删除整个窗口就出错
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-6-30 00:56:24 | 显示全部楼层
飛饵 发表于 2020-6-29 19:20
模拟器案例没问题啊?
怀疑是没删除列表上子控件造成的,但试了下还是一样,不管删没删子控件只要删除整 ...

嗯,对比排查下你的工程问题。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-19 02:48 , Processed in 0.434023 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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