硬汉嵌入式论坛

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

[emWin] 求助!在右上角的关闭时,想要弹出一个对话框,但是会死机?

[复制链接]

25

主题

300

回帖

380

积分

高级会员

积分
380
发表于 2018-10-17 19:41:38 | 显示全部楼层 |阅读模式
求助!在右上角的关闭时,想要弹出一个对话框,就像word里关闭文件时,提示是否保存的对话框。现在对话框做好了,用button按钮单击事件调用对话框时,使用没有问题,但是放在父窗口的WM_DELETE的消息里调用时,就会死机?是不是不能这样调用对话框?大家有没有好的解决办法?
回复

使用道具 举报

25

主题

300

回帖

380

积分

高级会员

积分
380
 楼主| 发表于 2018-10-17 19:42:38 | 显示全部楼层
在点击右上角的关闭按钮时
回复

使用道具 举报

25

主题

300

回帖

380

积分

高级会员

积分
380
 楼主| 发表于 2018-10-17 20:14:04 | 显示全部楼层
死在了hardfault,因为emwin使用的是lib文件,所以查不到死的源代码的地方
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2018-10-18 11:45:11 | 显示全部楼层
不好意思,楼主,现在才回复,发个完成测试代码,仅需要emWin,我试试。
回复

使用道具 举报

25

主题

300

回帖

380

积分

高级会员

积分
380
 楼主| 发表于 2018-10-18 13:25:26 | 显示全部楼层
本帖最后由 爱恋之燕 于 2018-10-18 13:28 编辑

这是父窗口的
回复

使用道具 举报

25

主题

300

回帖

380

积分

高级会员

积分
380
 楼主| 发表于 2018-10-18 13:28:00 | 显示全部楼层
本帖最后由 爱恋之燕 于 2018-10-18 13:30 编辑
  1. const static char *String_Key[3]={
  2.         "新增",
  3.         "编辑",
  4.         "删除"
  5. };
  6. /*        typedef struct {
  7.                 GUI_WIDGET_CREATE_FUNC * pfCreateIndirect;         // Create function
  8.                 const char * pName;                                                 // Text (not used for all widgets)
  9.                 I16 Id;                                                                         // Window ID of the widget
  10.                 I16 x0, y0, xSize, ySize;                                         // Size and position of the widget
  11.                 I16 Flags;                                                                         // Widget-specific flags (or 0)
  12.                 I32 Para;                                                                         // Widget-specific parameter (or 0)
  13.                 U32 NumExtraBytes;                                                         // Number of extra bytes usable
  14.     } GUI_WIDGET_CREATE_INFO;                                */
  15. static const GUI_WIDGET_CREATE_INFO _DialogCreate_AlarmSet[] = {
  16.         {FRAMEWIN_CreateIndirect,"报警人管理",0,0,0,800,456,FRAMEWIN_CF_ACTIVE,0,0},
  17.         
  18.         {LISTVIEW_CreateIndirect,NULL,GUI_ID_LISTVIEW0,54,20,690+2,320,0,0,0},
  19.         
  20.         {BUTTON_CreateIndirect,NULL,GUI_ID_BUTTON0,340,350,120,50,0,0,0},                        //"新增"Button        
  21.         {BUTTON_CreateIndirect,NULL,GUI_ID_BUTTON1,490,350,120,50,0,0,0},                        //"编辑"Button
  22.         {BUTTON_CreateIndirect,NULL,GUI_ID_BUTTON2,640,350,120,50,0,0,0},                        //"删除"Button
  23. };


  24. static void _InitDialog_AlarmSet(WM_MESSAGE *pMsg){
  25.         WM_HWIN hWin = pMsg->hWin;
  26.         HEADER_Handle         hHeader=0;
  27.         BUTTON_Handle        hButton=0;
  28.         
  29.         /*  Framewin 初始化  */
  30.         FRAMEWIN_SetFont(hWin, &GUI_FontHZ28);                                                //设置标题文本字体
  31.         FRAMEWIN_SetTextAlign(hWin, GUI_TA_VCENTER | GUI_TA_CENTER);//设置标题文本对齐方式
  32.         FRAMEWIN_SetTextColor(hWin, GUI_BLACK);                                                //设置标题文本颜色
  33.         FRAMEWIN_SetTitleHeight(hWin, 40);                                                        //设置标题栏的高度
  34.         FRAMEWIN_AddCloseButton(hWin,FRAMEWIN_BUTTON_RIGHT,0);
  35.         
  36.         /*  Listview 初始化  */
  37.         hListview_Alarm = WM_GetDialogItem(hWin,GUI_ID_LISTVIEW0);
  38.         hHeader = LISTVIEW_GetHeader(hListview_Alarm);                        
  39.         HEADER_SetFont(hHeader,&GUI_FontHZ20);                                //设置标题栏字体
  40.         HEADER_SetHeight(hHeader,30);                                                //设置标题栏高度
  41.         WM_DisableWindow(hHeader);
  42.         
  43.     LISTVIEW_SetFont(hListview_Alarm,&GUI_FontHZ20);                        //设置字体
  44.         LISTVIEW_SetRowHeight(hListview_Alarm,30);                                        //设置LISTVIEW行高
  45.         LISTVIEW_SetGridVis(hListview_Alarm,1);                                                //设置网格线可见
  46.         LISTVIEW_SetAutoScrollV(hListview_Alarm,1);                                        //添加垂直滚动条
  47.         LISTVIEW_SetWrapMode(hListview_Alarm,GUI_WRAPMODE_CHAR);        //设置为换行模式

  48.         LISTVIEW_AddColumn(hListview_Alarm,100,"序 号",        GUI_TA_CENTER|GUI_TA_VCENTER);
  49.     LISTVIEW_AddColumn(hListview_Alarm,280,"姓          名",GUI_TA_CENTER|GUI_TA_VCENTER);
  50.     LISTVIEW_AddColumn(hListview_Alarm,310,"电          话",GUI_TA_CENTER|GUI_TA_VCENTER);

  51.         /*-----        Button初始化 -----*/
  52.         for(uint8_t i=0;i<GUI_COUNTOF(String_Key);i++){
  53.                 hButton = WM_GetDialogItem(hWin,GUI_ID_BUTTON0+i);
  54.                 BUTTON_SetFont(hButton,&GUI_FontHZ24);
  55.                 BUTTON_SetText(hButton,String_Key[i]);
  56.         }
  57.         
  58.         //WM_MakeModal(hWin);
  59. }


  60. static void _NotifyParent_AlarmSet(WM_HWIN hWin,int NCode,int Id){
  61.         switch(Id){
  62.                 case GUI_ID_BUTTON0:
  63.                         if(NCode==WM_NOTIFICATION_RELEASED){
  64.                                 <font color="#ff0000">My_MessageBox_Select("是否保存?","提示");                           //在这里调用没有问题</font>
  65.                                 WM_SetFocus(WM_GetDialogItem(hWin,GUI_ID_BUTTON0));
  66.                         }
  67.                         break;
  68.                 case GUI_ID_BUTTON1:
  69.                         if(NCode==WM_NOTIFICATION_RELEASED){
  70.                                 WM_SetFocus(WM_GetDialogItem(hWin,GUI_ID_BUTTON1));
  71.                         }
  72.                         break;        
  73.                 case GUI_ID_BUTTON2:
  74.                         if(NCode==WM_NOTIFICATION_RELEASED){
  75.                                 WM_SetFocus(WM_GetDialogItem(hWin,GUI_ID_BUTTON2));
  76.                         }
  77.                         break;        
  78.                 default:break;
  79.         }        
  80. }


  81. static void _callback_AlarmSet(WM_MESSAGE *pMsg){
  82.         int NCode,Id;
  83.         WM_HWIN hWin = pMsg->hWin;
  84.         
  85.         switch(pMsg->MsgId){
  86.                 case WM_DELETE:                                //删除窗口前,发送的消息
  87.                         <font color="#ff0000">My_MessageBox_Select("是否保存?","提示");   //在这里调用会死机</font>
  88.                         Flag_Exit=true;
  89.                         break;
  90.                 case WM_KEY:                                                                                        //按键消息
  91.                         break;
  92.                 case WM_PAINT:
  93.                         GUI_SetBkColor(GUI_WHITE);
  94.                         GUI_Clear();
  95.                         GUI_SetFont(&GUI_FontHZ28);
  96.                         GUI_SetColor(GUI_BLACK);
  97.                         break;
  98.                 case WM_INIT_DIALOG:
  99.                         _InitDialog_AlarmSet(pMsg);
  100.                         break;
  101.                 case WM_NOTIFY_PARENT:
  102.                         Id = WM_GetId(pMsg->hWinSrc);
  103.                         NCode = pMsg->Data.v;
  104.                         _NotifyParent_AlarmSet(hWin,NCode,Id);
  105.                         break;
  106.                 default:
  107.                         WM_DefaultProc(pMsg);
  108.                         break;
  109.         }
  110. }

  111. /*******************************************************************
  112. * @brief         函数说明:
  113. * @param         输入参数:
  114. * @retval         返回参数:无
  115. *******************************************************************/
  116. void App_AlarmSet(void){        
  117.         Flag_Exit = false;
  118.         
  119.         
  120.         GUI_CreateDialogBox(        _DialogCreate_AlarmSet,
  121.                                                         GUI_COUNTOF(_DialogCreate_AlarmSet),
  122.                                                         &_callback_AlarmSet,
  123.                                                         0,
  124.                                                         0,
  125.                                                         0);


  126.         
  127.         while(!Flag_Exit){
  128.                 GUI_Delay(50);
  129.         }        
  130.         
  131. }
复制代码


回复

使用道具 举报

25

主题

300

回帖

380

积分

高级会员

积分
380
 楼主| 发表于 2018-10-18 13:31:24 | 显示全部楼层
这是 要弹出的子窗口的,只做了界面显示部分的
  1. static bool Flag_Exit=false;

  2. /*        typedef struct {
  3.                 GUI_WIDGET_CREATE_FUNC * pfCreateIndirect;         // Create function
  4.                 const char * pName;                                                 // Text (not used for all widgets)
  5.                 I16 Id;                                                                         // Window ID of the widget
  6.                 I16 x0, y0, xSize, ySize;                                         // Size and position of the widget
  7.                 I16 Flags;                                                                         // Widget-specific flags (or 0)
  8.                 I32 Para;                                                                         // Widget-specific parameter (or 0)
  9.                 U32 NumExtraBytes;                                                         // Number of extra bytes usable
  10.                 } GUI_WIDGET_CREATE_INFO;                                */
  11. static const GUI_WIDGET_CREATE_INFO _DialogCreate_MessageBox[] = {
  12.         {FRAMEWIN_CreateIndirect,NULL,0,200,100,400,200,FRAMEWIN_CF_ACTIVE,0,0},
  13.                
  14.         {BUTTON_CreateIndirect,NULL,GUI_ID_BUTTON0,0,0,120,50,0,0,0},                        //"新增"Button       
  15.         {BUTTON_CreateIndirect,NULL,GUI_ID_BUTTON1,130,0,120,50,0,0,0},                        //"编辑"Button
  16. };

  17. static void _InitDialog_MessageBoxSelect(WM_MESSAGE *pMsg){
  18.         WM_HWIN hWin = pMsg->hWin;
  19.         HEADER_Handle         hHeader=0;
  20.         BUTTON_Handle        hButton=0;
  21.        
  22.         /*  Framewin 初始化  */
  23.         FRAMEWIN_SetFont(hWin, &GUI_FontHZ28);                                                //设置标题文本字体
  24.         FRAMEWIN_SetTextAlign(hWin, GUI_TA_VCENTER | GUI_TA_CENTER);//设置标题文本对齐方式
  25.         FRAMEWIN_SetTextColor(hWin, GUI_BLACK);                                                //设置标题文本颜色
  26.         FRAMEWIN_SetTitleHeight(hWin, 40);                                                        //设置标题栏的高度
  27.         FRAMEWIN_AddCloseButton(hWin,FRAMEWIN_BUTTON_RIGHT,0);
  28. }

  29. static void _callback_MessageBoxSelect(WM_MESSAGE *pMsg){
  30.         int NCode,Id;
  31.         WM_HWIN hWin = pMsg->hWin;
  32.        
  33.         switch(pMsg->MsgId){
  34.                 case WM_DELETE:                                //删除窗口前,发送的消息
  35.                         Flag_Exit=true;
  36.                         break;
  37.                 case WM_KEY:                                                                                        //按键消息
  38.                         break;
  39.                 case WM_PAINT:
  40.                         GUI_SetBkColor(GUI_WHITE);
  41.                         GUI_Clear();
  42.                         GUI_SetFont(&GUI_FontHZ28);
  43.                         GUI_SetColor(GUI_BLACK);
  44.                         break;
  45.                 case WM_INIT_DIALOG:
  46.                         _InitDialog_MessageBoxSelect(pMsg);
  47.                         break;
  48.                 case WM_NOTIFY_PARENT:
  49.                         Id = WM_GetId(pMsg->hWinSrc);
  50.                         NCode = pMsg->Data.v;
  51.                         //_NotifyParent_AlarmSet(hWin,NCode,Id);
  52.                         break;
  53.                 default:
  54.                         WM_DefaultProc(pMsg);
  55.                         break;
  56.         }
  57. }

  58. /*******************************************************************
  59. * @brief         函数说明:选择对话框,有"是"和"否"两个Button选择
  60. * @param         输入参数:
  61. * @retval         返回参数:0:否;1:是;
  62. *******************************************************************/
  63. uint8_t My_MessageBox_Select(const char*sMessage,const char*sCaption){
  64.         Flag_Exit = false;
  65.        
  66.         GUI_ExecDialogBox(        _DialogCreate_MessageBox,
  67.                                                         GUI_COUNTOF(_DialogCreate_MessageBox),
  68.                                                         &_callback_MessageBoxSelect,
  69.                                                         0,
  70.                                                         0,
  71.                                                         0);
  72.        
  73.         while(!Flag_Exit){
  74.                 GUI_Delay(50);
  75.         }       
  76. }
复制代码


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2018-10-19 11:13:23 | 显示全部楼层
爱恋之燕 发表于 2018-10-18 13:31
这是 要弹出的子窗口的,只做了界面显示部分的

注意一点,你的GUI任务,仅需一个while大循环即可,你当前的调用容易早期多级嵌套GUI_Delay。比较容易卡死在里面,这种情况在使用模拟器的时候很明显,会弹出窗口提示你。

另外对话框全部用非阻塞的。
回复

使用道具 举报

25

主题

300

回帖

380

积分

高级会员

积分
380
 楼主| 发表于 2018-10-19 12:59:41 | 显示全部楼层
像提示是否保存文件这种对话框,只能用阻塞式的,必须要选择是还是否才能进行下一步,不能放到后台窗口去
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2018-10-20 01:59:16 | 显示全部楼层
爱恋之燕 发表于 2018-10-19 12:59
像提示是否保存文件这种对话框,只能用阻塞式的,必须要选择是还是否才能进行下一步,不能放到后台窗口去

可以使能模态。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-17 18:23 , Processed in 0.267425 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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