硬汉嵌入式论坛

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

[emWin] emWin中数据传递函数<WIDGET>_GetUserData和<WIDGET>_SetUserData

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107397
QQ
发表于 2017-6-6 15:54:49 | 显示全部楼层 |阅读模式
现在emWin大部分控件都有这两个函数了,使用也比较方面,作用就是起到一个数据传递的效果,传递方法是把数据通过函数<WIDGET>_SetUserData复制到控件开辟的空间里面,需要的时候,通过调用函数<WIDGET>_GetUserData获取存储的数据即可。
下面以对话框上面创建WINDOW控件为例进行说明:

1.  创建控件的时候设置额外字节大小:
1.png

   
2. 调用函数WINDOW_SetUserData设置要传递的数据。
1.png

3.png

   
3. 设置好之后,获取采用函数WINDOW_GetUserData。特别注意,这个函数获取的数据是要复制出来的,所以用户定义的缓存要够大。
4.png










回复

使用道具 举报

13

主题

38

回帖

77

积分

初级会员

积分
77
发表于 2018-11-30 11:24:55 | 显示全部楼层
eric2013您好:
我使用code:Blocks模擬,寫一個簡單的WM_SetUserData()和WM_GetUserData(),創建窗口後呼叫WM_SetUserData()把值傳入,按下button後用WM_GetUserData()讀出資料。但只要按A、C兩鍵程式就會當掉,按B卻不會 。感謝你。
  1. /*********************************************************************
  2. *                                                                    *
  3. *                SEGGER Microcontroller GmbH & Co. KG                *
  4. *        Solutions for real time microcontroller applications        *
  5. *                                                                    *
  6. **********************************************************************
  7. *                                                                    *
  8. * C-file generated by:                                               *
  9. *                                                                    *
  10. *        GUI_Builder for emWin version 5.32                          *
  11. *        Compiled Oct  8 2015, 11:59:02                              *
  12. *        (c) 2015 Segger Microcontroller GmbH & Co. KG               *
  13. *                                                                    *
  14. **********************************************************************
  15. *                                                                    *
  16. *        Internet: www.segger.com  Support: support@segger.com       *
  17. *                                                                    *
  18. **********************************************************************
  19. */

  20. // USER START (Optionally insert additional includes)
  21. // USER END

  22. #include "DIALOG.h"

  23. /*********************************************************************
  24. *
  25. *       Defines
  26. *
  27. **********************************************************************
  28. */
  29. #define ID_WINDOW_0    (GUI_ID_USER + 0x00)
  30. #define ID_BUTTON_0    (GUI_ID_USER + 0x01)
  31. #define ID_BUTTON_1    (GUI_ID_USER + 0x02)
  32. #define ID_BUTTON_2    (GUI_ID_USER + 0x03)


  33. // USER START (Optionally insert additional defines)
  34. // USER END

  35. /*********************************************************************
  36. *
  37. *       Static data
  38. *
  39. **********************************************************************
  40. */

  41. // USER START (Optionally insert additional static data)
  42. // USER END

  43. /*********************************************************************
  44. *
  45. *       _aDialogCreate
  46. */
  47. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  48.   { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 480, 272, 0, 0x0, 12 },
  49.   { BUTTON_CreateIndirect, "B", ID_BUTTON_0, 145, 183, 80, 60, 0, 0x0, 0 },
  50.   { BUTTON_CreateIndirect, "A", ID_BUTTON_1, 26, 187, 80, 56, 0, 0x0, 0 },
  51.   { BUTTON_CreateIndirect, "C", ID_BUTTON_2, 292, 190, 80, 46, 0, 0x0, 0 },
  52.   // USER START (Optionally insert additional widgets)
  53.   // USER END
  54. };

  55. /*********************************************************************
  56. *
  57. *       Static code
  58. *
  59. **********************************************************************
  60. */

  61. // USER START (Optionally insert additional static code)
  62. // USER END

  63. /*********************************************************************
  64. *
  65. *       _cbDialog
  66. */
  67. static void _cbDialog(WM_MESSAGE * pMsg) {
  68.   WM_HWIN hItem,hWin_temp[3];
  69.   int     NCode;
  70.   int     Id;
  71.   // USER START (Optionally insert additional variables)
  72.   // USER END
  73.   hItem = pMsg->hWin;
  74.   switch (pMsg->MsgId) {
  75.   case WM_INIT_DIALOG:
  76.     //
  77.     // Initialization of 'Window'
  78.     //
  79.     hItem = pMsg->hWin;
  80.     WINDOW_SetBkColor(hItem, GUI_MAKE_COLOR(0x0000FFFF));
  81.     // USER START (Optionally insert additional code for further widget initialization)
  82.     // USER END
  83.     break;
  84.   case WM_NOTIFY_PARENT:
  85.     Id    = WM_GetId(pMsg->hWinSrc);
  86.     NCode = pMsg->Data.v;
  87.     switch(Id) {
  88.     case ID_BUTTON_0: // Notifications sent by 'B'
  89.       switch(NCode) {
  90.       case WM_NOTIFICATION_CLICKED:
  91.         // USER START (Optionally insert code for reacting on notification message)
  92.         // USER END
  93.         break;
  94.       case WM_NOTIFICATION_RELEASED:
  95.          WM_GetUserData(hItem,hWin_temp,12);
  96.         break;
  97.       // USER START (Optionally insert additional code for further notification handling)
  98.       // USER END
  99.       }
  100.       break;
  101.     case ID_BUTTON_1: // Notifications sent by 'A'
  102.       switch(NCode) {
  103.       case WM_NOTIFICATION_CLICKED:
  104.         // USER START (Optionally insert code for reacting on notification message)
  105.         // USER END
  106.         break;
  107.       case WM_NOTIFICATION_RELEASED:
  108.           WM_GetUserData(hItem,hWin_temp,12);
  109.         // USER START (Optionally insert code for reacting on notification message)
  110.         // USER END
  111.         break;
  112.       // USER START (Optionally insert additional code for further notification handling)
  113.       // USER END
  114.       }
  115.       break;
  116.     case ID_BUTTON_2: // Notifications sent by 'C'
  117.       switch(NCode) {
  118.       case WM_NOTIFICATION_CLICKED:
  119.         // USER START (Optionally insert code for reacting on notification message)
  120.         // USER END
  121.         break;
  122.       case WM_NOTIFICATION_RELEASED:
  123.           WM_GetUserData(hItem,hWin_temp,12);
  124.         // USER START (Optionally insert code for reacting on notification message)
  125.         // USER END
  126.         break;
  127.       // USER START (Optionally insert additional code for further notification handling)
  128.       // USER END
  129.       }
  130.       break;
  131.     // USER START (Optionally insert additional code for further Ids)
  132.     // USER END
  133.     }
  134.     break;
  135.   // USER START (Optionally insert additional message handling)
  136.   // USER END
  137.   default:
  138.     WM_DefaultProc(pMsg);
  139.     break;
  140.   }
  141. }

  142. /*********************************************************************
  143. *
  144. *       Public code
  145. *
  146. **********************************************************************
  147. */
  148. /*********************************************************************
  149. *
  150. *       CreateWindow
  151. */
  152. WM_HWIN CreateWindow(void);
  153. WM_HWIN CreateWindow(void) {
  154.   WM_HWIN hWin,hWin_temp[3];

  155.   hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);

  156.   hWin_temp[0] =11;
  157.   hWin_temp[1] =88;
  158.   hWin_temp[2] =99;
  159.   WM_SetUserData(hWin,hWin_temp,12);
  160.   return hWin;
  161. }



  162. // USER START (Optionally insert additional public code)
  163. // USER END

  164. /*************************** End of file ****************************/
  165. void MainTask(void) {
  166.     WM_HWIN Whin;
  167.     GUI_Init();
  168.     CreateWindow();
  169.     while (1) {
  170.         //WM_ForEachDesc(WM_HBKWIN, _cbDoSomething, (void *)&Value);
  171.         //Value *= -1;

  172.         GUI_Delay(1);
  173.     }
  174. }
复制代码
回复

使用道具 举报

13

主题

38

回帖

77

积分

初级会员

积分
77
发表于 2018-11-30 16:41:40 | 显示全部楼层
victor0726 发表于 2018-11-30 11:24
eric2013您好:
我使用code:Blocks模擬,寫一個簡單的WM_SetUserData()和WM_GetUserData(),創建窗口後呼 ...

是否有人知道為何程式無法使用WM_GetUserData()抓到資料呢。感謝~
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107397
QQ
 楼主| 发表于 2018-12-1 02:37:50 | 显示全部楼层
victor0726 发表于 2018-11-30 16:41
是否有人知道為何程式無法使用WM_GetUserData()抓到資料呢。感謝~

WM_GetUserData(hItem,hWin_temp,12);第1个参数有误,你要是pMsg->hWin
因为你的hItem是局部变量。
回复

使用道具 举报

13

主题

38

回帖

77

积分

初级会员

积分
77
发表于 2018-12-3 08:58:21 | 显示全部楼层
eric2013 发表于 2018-12-1 02:37
WM_GetUserData(hItem,hWin_temp,12);第1个参数有误,你要是pMsg->hWin
因为你的hItem是局部变量。

eric2013 你好:

我前面有將hItem = pMsg->hWin,問題不在這裡,而是WM_SetUserData(hWin,hWin_temp,12);
如果我將緩沖區的大小設成8就可以讀取8個bytes出來,但設為12時程式就會當掉了。 不知道您那邊是否也會有這樣的情況呢? 讀取4或8都可以。 謝謝
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107397
QQ
 楼主| 发表于 2018-12-3 10:38:09 | 显示全部楼层
victor0726 发表于 2018-12-3 08:58
eric2013 你好:

我前面有將hItem = pMsg->hWin,問題不在這裡,而是WM_SetUserData(hWin,hWin_temp,12 ...

看到了,你前面做了1次赋值
QQ截图20181203103910.jpg


你加大下这里的数据,搞个1024试试
QQ截图20181203103801.jpg

回复

使用道具 举报

13

主题

38

回帖

77

积分

初级会员

积分
77
发表于 2018-12-3 11:17:07 | 显示全部楼层
eric2013 发表于 2018-12-3 10:38
看到了,你前面做了1次赋值

eric2013 你好:
改成1024問題仍存在。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107397
QQ
 楼主| 发表于 2018-12-4 01:19:16 | 显示全部楼层
没注意你用的是WM_XXXX,你改成我楼主位的WINDOW_XXXX即可

QQ截图20181204011837.jpg
回复

使用道具 举报

13

主题

38

回帖

77

积分

初级会员

积分
77
发表于 2018-12-4 15:38:12 | 显示全部楼层
eric2013 发表于 2018-12-4 01:19
没注意你用的是WM_XXXX,你改成我楼主位的WINDOW_XXXX即可

eric2013您好:

謝謝回覆,後來發現說明書裡有寫到用資源表創建窗口時,要用窗口小工具API。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-30 01:29 , Processed in 0.205345 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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