OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12703|回复: 5

GUI_EndDialog()和WM_GetDialogItem()函数使用

[复制链接]

2

主题

9

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2013-7-31
在线时间
0 小时
发表于 2015-5-12 11:15:16 | 显示全部楼层 |阅读模式
5金钱
(1)void GUI_EndDialog(WM_HWIN hDialog, int r); 函数的形参R的作用是什么,看到有些程序是0,有些是1,不知道这是什么原因?
(2)WM_GetDialogItem()获取对话框句柄必须紧跟(方式1) case WM_INIT_DIALOG:后吗?我测试的时候,发现下面第2种方式获取句柄后无法关闭对话框;
方式1:
case WM_INIT_DIALOG: 
  Fwin1 = WM_GetDialogItem(pMsg->hWin, ID_FRAMEWIN_1);
    hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0);
    EDIT_SetText(hItem, "");
    break;

方式2:
case WM_INIT_DIALOG: 
    hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0);
    EDIT_SetText(hItem, "");    
    Fwin1 = WM_GetDialogItem(pMsg->hWin, ID_FRAMEWIN_1);    
    break;

回调函数如下:
static void _cbDialog1(WM_MESSAGE * pMsg) {
  WM_HWIN hItem;
  int     NCode;
  int     Id;
  // USER START (Optionally insert additional variables)
  // USER END
  WM_HWIN Fwin1;
  switch (pMsg->MsgId) {
  case WM_INIT_DIALOG: 
  
  Fwin1 = WM_GetDialogItem(pMsg->hWin, ID_FRAMEWIN_1);
    hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0);
    EDIT_SetText(hItem, "");
    break;
  case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);
    NCode = pMsg->Data.v;
    switch(Id) {
    case ID_EDIT_0: // Notifications sent by 'Edit'
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      case WM_NOTIFICATION_RELEASED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      case WM_NOTIFICATION_VALUE_CHANGED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      // USER START (Optionally insert additional code for further notification handling)
      // USER END
      }
      break;
    case ID_BUTTON_15: // Notifications sent by 'OK'
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      case WM_NOTIFICATION_RELEASED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
GUI_EndDialog(Fwin1,0);    
        break;
      // USER START (Optionally insert additional code for further notification handling)
      // USER END
      }
      break;
    // USER START (Optionally insert additional code for further Ids)
    // USER END
    }
    break;
  // USER START (Optionally insert additional message handling)
  // USER END
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}

奋斗,给她一个幸福的未来
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-5-12 23:11:18 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

14

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2015-11-2
在线时间
17 小时
发表于 2016-1-9 16:18:39 | 显示全部楼层
这个参数是专门针对阻塞式窗口说的,非阻塞式窗口忽略这个参数
回复

使用道具 举报

0

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
478
金钱
478
注册时间
2015-7-11
在线时间
145 小时
发表于 2016-4-20 16:39:53 | 显示全部楼层
问题1:GUI_EndDialog()是相对于阻塞式窗口来说的。
若使用GUI_CreateDialogBox()函数创建非阻塞式窗口,该函数返回的是创建窗口的句柄,这时对于GUI_EndDialog()来说仅仅只是结束该对话框,没有返回值的意义;
若使用GUI_ExecDialogBox()函数创建阻塞式窗口,该函数返回的一个int型数据,这时对于GUI_EndDialog()来说可以结束该对话框,并返回该函数的形参r。
问题2:我觉得Fwin1这个局部变量定义的有问题,虽然在WM_INIT_DIALOG中有执行Fwin1 = WM_GetDialogItem(pMsg->hWin, ID_FRAMEWIN_1),我们可以知道Fwin1是ID_FRAMEWIN_1的句柄,但是在WM_NOTIFY_PARENT的BUTTON15释放的时候,因为Fwin1是局部变量,当退出回调函数时,Fwin1已不是ID_FRAMEWIN_1的句柄了,所以我认为应该把Fwin1 = WM_GetDialogItem(pMsg->hWin, ID_FRAMEWIN_1)放在GUI_EndDialog(Fwin1,0)前执行。
回复

使用道具 举报

27

主题

101

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1007
金钱
1007
注册时间
2015-7-26
在线时间
108 小时
发表于 2016-6-6 17:19:54 | 显示全部楼层
inthesun 发表于 2016-4-20 16:39
问题1:GUI_EndDialog()是相对于阻塞式窗口来说的。
若使用GUI_CreateDialogBox()函数创建非阻塞式窗口, ...

GUI_EndDialog结束对话框和WM_DeleteWindow删除窗口这两个实现的效果是一样的这两个使用起来有什么区别呢?
回复

使用道具 举报

18

主题

422

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1139
金钱
1139
注册时间
2014-5-24
在线时间
116 小时
发表于 2016-6-7 10:57:44 | 显示全部楼层
GUI_EndDialog(),int r 用于返回参数,传递的值会在GUI_ExecDialogBox()中返回,可以此判断结果,数字含义自定义;
I See Fire.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.  只给方向,不妨碍思考
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 19:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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