硬汉嵌入式论坛

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

[emWin] 无任何BUTTON的界面如何获取外部按键

[复制链接]

26

主题

181

回帖

259

积分

高级会员

积分
259
发表于 2019-7-3 07:55:25 | 显示全部楼层 |阅读模式
本帖最后由 ccschen 于 2019-7-3 07:57 编辑

现在手上有一个工程,有好几个界面,用外部按键切换界面,但是界面上无任何按键,只有TEXT控件,也就是无法用SEND KEY之类的发送过去让界面获取,有没有办法让界面响应CASE WM_KEY?
现在用了RTOS,有没有办法直接发消息到界面,这边试了传送的键不成功。

     pMsgInfo.MsgId = WM_KEY;
     pMsgInfo.Data.p = (WM_KEY_INFO*)GUI_KEY_F1;
     WM_SendMessage(CurrenthWin, &pMsgInfo);

回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2019-7-3 08:08:41 | 显示全部楼层
传送过去的Key和PressedCnt都不对。
回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2019-7-3 08:43:45 | 显示全部楼层
用hWin = WM_CreateWindow(0, 0, 128, 64, WM_CF_SHOW, _cbDialog, 0);建立的窗口可以直接发送KEY值进去,不用消息方式,但是窗口不显示。。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-7-3 10:11:58 | 显示全部楼层
WM_CreateWindow创建的窗口,本身就支持聚焦,可以接受GUI_SendKeyMsg直接发送按键消息


建议直接上程序,方便我给你测试,程序越简单越好
回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2019-7-3 12:46:47 | 显示全部楼层
程序非常的多。。。不好剥离,现在用的单色OLED屏,用GUI_CreateDialogBox建立的窗口不能获取按键但显示正常,因为没有BUTTON的元素。WM_CreateWindow居然不显示窗口,确认了背景色之类的是对的。
回复

使用道具 举报

9

主题

140

回帖

187

积分

初级会员

积分
187
QQ
发表于 2019-7-3 14:23:03 | 显示全部楼层
自定义窗口消息,通过发送广播函数
  1. WM_MESSAGE msg;

  2. msg.MsgId  = WM_KEY_CANCEL;
  3. WM_BroadcastMessage(&msg);
复制代码


窗口回调函数接收消息
  1. static void _cbCallback(WM_MESSAGE * pMsg)
  2. {
  3. //    int NCode, Id;
  4.     WM_HWIN hWin = pMsg->hWin;
  5.         WM_HWIN hItem;
  6.     switch (pMsg->MsgId)
  7.     {
  8.         case WM_KEY_CANCEL:
  9.             GUI_EndDialog(hWin, 0);
  10.             break;
  11. }
复制代码
回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2019-7-3 16:12:05 | 显示全部楼层
allyzc 发表于 2019-7-3 14:23
自定义窗口消息,通过发送广播函数

谢谢大佬。现在比较感兴趣的问题是窗口不显示,用WM_CreateWindow不显示,然后把文件放到原来在用的工程中调用也是不显示。
回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2019-7-3 16:16:58 | 显示全部楼层
  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.44                          *
  11. *        Compiled Nov 10 2017, 08:53:57                              *
  12. *        (c) 2017 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. #include "main.h"
  22. // USER END

  23. #include "DIALOG.h"

  24. /*********************************************************************
  25. *
  26. *       Defines
  27. *
  28. **********************************************************************
  29. */
  30. #define ID_WINDOW_0   (GUI_ID_USER + 0x00)
  31. #define ID_TEXT_0   (GUI_ID_USER + 0x01)
  32. #define ID_TEXT_1   (GUI_ID_USER + 0x02)


  33. // USER START (Optionally insert additional defines)
  34. extern GUI_CONST_STORAGE GUI_FONT GUI_FontSong32Cu;
  35. #define ID_SYSINFO_TIMER_TIME                  (GUI_ID_USER + 0x9A)
  36. extern WM_HWIN pWin;
  37. // USER END

  38. /*********************************************************************
  39. *
  40. *       Static data
  41. *
  42. **********************************************************************
  43. */

  44. // USER START (Optionally insert additional static data)
  45. // USER END

  46. /*********************************************************************
  47. *
  48. *       _aDialogCreate
  49. */
  50. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  51.   { WINDOW_CreateIndirect, "SysStatus", ID_WINDOW_0, 0, 0, 128, 64, 0, 0x0, 0 },
  52.   { TEXT_CreateIndirect, "Text", ID_TEXT_0, 0, 5, 128, 35, 0, 0x64, 0 },
  53.   { TEXT_CreateIndirect, "DEVICESERIESNUMBER", ID_TEXT_1, 40, 44, 85, 20, 0, 0x64, 0 },
  54.   // USER START (Optionally insert additional widgets)
  55.   // USER END
  56. };

  57. /*********************************************************************
  58. *
  59. *       Static code
  60. *
  61. **********************************************************************
  62. */

  63. // USER START (Optionally insert additional static code)

  64. // USER END

  65. /*********************************************************************
  66. *
  67. *       _cbDialog
  68. */
  69. static void _cbDialog(WM_MESSAGE * pMsg) {
  70.   WM_HWIN hItem;
  71.   // USER START (Optionally insert additional variables)
  72.         WM_HWIN hWin = pMsg->hWin;       
  73.         static uint8_t TempStr[25];
  74.   // USER END

  75.   switch (pMsg->MsgId) {
  76.   case WM_INIT_DIALOG:
  77.     //
  78.     // Initialization of 'Text'
  79.     //
  80.     hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
  81.     TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
  82.     TEXT_SetFont(hItem, GUI_FONT_32B_ASCII);
  83.     TEXT_SetText(hItem, "LOGGING");
  84.     //
  85.     // Initialization of 'DEVICESERIESNUMBER'
  86.     //
  87.     hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_1);
  88.     TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
  89.     TEXT_SetFont(hItem, GUI_FONT_20B_ASCII);
  90.     TEXT_SetText(hItem, "0001");
  91.     // USER START (Optionally insert additional code for further widget initialization)
  92.                 hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);       
  93.                 TEXT_SetFont(hItem, &GUI_FontSong32Cu);               

  94.                 WM_SetFocus(pMsg->hWin);       
  95.     // USER END
  96.     break;
  97.   // USER START (Optionally insert additional message handling)
  98.   case WM_CREATE:
  99.     WM_CreateTimer(hWin, ID_SYSINFO_TIMER_TIME, 1000, 0);
  100.     break;
  101.        
  102.           case WM_TIMER:
  103.     /* Refrish real time display */   
  104.     //WM_InvalidateWindow(pMsg->hWin);
  105.     WM_RestartTimer(pMsg->Data.v, 1000);
  106.                 if(WM_IsCompletelyCovered(pMsg->hWin)) break;        //当切换到其他页面什么都不做
  107.                 //refresh data display
  108. //                GUI_PollKeyMsg();

  109.        
  110.                 break;       
  111.                        
  112.           case WM_KEY:

  113.                         switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
  114.                         {
  115.                                 case GUI_KEY_POWERONOFF:
  116.                                         //GUI_Delay(10);

  117.                                         WM_InvalidateWindow(WM_GetParent(pMsg->hWin));
  118.                                         GUI_EndDialog(pMsg->hWin, 0);
  119.                                 break;                       
  120.                                 case GUI_KEY_ACQ:
  121.                                         GUI_Delay(10);
  122.                                         //WM_InvalidateWindow(WM_GetParent(pMsg->hWin));
  123.                                         //GUI_EndDialog(pMsg->hWin, 0);
  124.                                 break;
  125.                                 case GUI_KEY_SELECT:
  126.                                         //GUI_Delay(10);
  127.                                         WM_InvalidateWindow(WM_GetParent(pMsg->hWin));
  128.                                         GUI_EndDialog(pMsg->hWin, 0);
  129.                                 break;       
  130.                                 case GUI_KEY_RETURN:
  131.                                         //GUI_Delay(10);
  132.                                         WM_InvalidateWindow(WM_GetParent(pMsg->hWin));
  133.                                         GUI_EndDialog(pMsg->hWin, 0);
  134.                                 break;       
  135.                                 case GUI_KEY_PRINT:
  136.                                         //GUI_Delay(10);

  137.                                         pWin = WM_GetPrevSibling(pMsg->hWin);                               
  138.         //                                        WM_InvalidateWindow(WM_GetParent(pMsg->hWin));
  139.                                         GUI_EndDialog(pMsg->hWin, 0);       
  140.         //                                        WM_SelectWindow(hWin);
  141.                                         WM_SetFocus(pWin);                               
  142.                                 break;
  143.                         }
  144.                 break;                       
  145.   // USER END
  146.   default:
  147.     WM_DefaultProc(pMsg);
  148.     break;
  149.   }
  150. }

  151. /*********************************************************************
  152. *
  153. *       Public code
  154. *
  155. **********************************************************************
  156. */
  157. /*********************************************************************
  158. *
  159. *       CreateSysStatus
  160. */
  161. WM_HWIN CreateSysStatus(void);
  162. WM_HWIN CreateSysStatus(void) {
  163.   WM_HWIN hWin;

  164.   hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  165.   return hWin;
  166. }

  167. // USER START (Optionally insert additional public code)
  168. WM_HWIN CreateSysStatus1(void);
  169. WM_HWIN CreateSysStatus1(void) {
  170.   WM_HWIN hWin;
  171.        
  172.         WM_SetCreateFlags(WM_CF_MEMDEV);       
  173.         GUI_EnableAlpha(1);
  174.         WM_MULTIBUF_Enable(1);
  175.         WM_SetDesktopColor(GUI_WHITE);
  176.         WM_EnableMemdev(WM_GetDesktopWindow());
  177.         GUI_UC_SetEncodeUTF8();

  178.   //hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  179.         hWin = WM_CreateWindow(0, 0, 128, 64, WM_CF_MEMDEV_ON_REDRAW | WM_CF_FGND | WM_CF_SHOW, _cbDialog, sizeof(WM_HWIN));
  180.         WM_SelectWindow(hWin);
  181.         WM_Exec();
  182.         GUI_Exec();
  183. //  WM_CreateWindowAsChild(0,
  184. //                         0,
  185. //                         128,//LCD_GetXSize(),
  186. //                         64,
  187. //                         //WM_HBKWIN,
  188. //                                                                                                 WM_GetDesktopWindow(),
  189. //                         WM_CF_SHOW /*| WM_CF_HASTRANS */,          
  190. //                         _cbDialog,
  191. //                         0);       
  192. //        WM_CreateTimer(WM_GetClientWindow(hWin), ID_SYSINFO_TIMER_TIME, 1000, 0);
  193.   return hWin;
  194. }
  195. // USER END

  196. /*************************** End of file ****************************/
复制代码
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-7-3 17:24:20 | 显示全部楼层

你发的这个程序是啥问题,WM_KEY消息进去了没执行??
回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2019-7-3 17:30:04 | 显示全部楼层
本帖最后由 ccschen 于 2019-7-3 17:31 编辑
eric2013 发表于 2019-7-3 17:24
你发的这个程序是啥问题,WM_KEY消息进去了没执行??

就是界面不显示,一片空白。能进WM_KEY并且能执行,关闭窗口,定时器也能进。
用WM_CreateWindow建立的窗口就是不能显示,不显示任何东西。界面上就两个TEXT。
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2019-7-3 17:31:17 | 显示全部楼层
怎么while(1)循环都没看到?
另外,如果用GUI_SendMessage函数的话,hWin应该是Framewin的Client句柄,用 WM_GetClientWindow函数获取,直接发给Framewin句柄的话,回调函数是收不到 WM_KEY 消息的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-7-3 17:33:41 | 显示全部楼层
ccschen 发表于 2019-7-3 17:30
就是界面不显示,一片空白。能进WM_KEY并且能执行,关闭窗口,定时器也能进。
用WM_CreateWindow建立的 ...

WM_INIT_DIALOG消息是对话框才有的,你用WM_CreateWindow肯定不会执行啊
回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2019-7-3 17:34:32 | 显示全部楼层
eric2013 发表于 2019-7-3 17:33
WM_INIT_DIALOG消息是对话框才有的,你用WM_CreateWindow肯定不会执行啊

那要怎么初始化呢?我看看,谢谢啊。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-7-3 18:03:44 | 显示全部楼层
ccschen 发表于 2019-7-3 17:34
那要怎么初始化呢?我看看,谢谢啊。

要单独创建,然后仅这个窗口做父窗口
回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2019-7-3 18:04:08 | 显示全部楼层
eric2013 发表于 2019-7-3 17:33
WM_INIT_DIALOG消息是对话框才有的,你用WM_CreateWindow肯定不会执行啊

我看了,执行了,但是不显示,换其它的回调消息来做也不行,用WM_CREATE来放置文本控件也不行。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-7-3 18:08:31 | 显示全部楼层
ccschen 发表于 2019-7-3 18:04
我看了,执行了,但是不显示,换其它的回调消息来做也不行,用WM_CREATE来放置文本控件也不行。

1、WM_INIT_DIALOG是对话框初始化消息,你用WM_CreateWindow的回调是绝对不会执行的,除非程序异常了
2、你用WM_CreateWindow的WM_CREATE消息,你要单独在这个回调里面创建文本才行,不能再使用对话框的资源列表形式。

这个问题就帮你这么多吧
回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2019-7-3 18:32:38 | 显示全部楼层
eric2013 发表于 2019-7-3 18:08
1、WM_INIT_DIALOG是对话框初始化消息,你用WM_CreateWindow的回调是绝对不会执行的,除非程序异常了
2 ...

谢谢大佬,在WM_CREATE里面直接新建文本是可以的。好麻烦哦,没配置界面配置方便,坐标这些都要设置。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 00:46 , Processed in 0.271236 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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