硬汉嵌入式论坛

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

[emWin] 求助,从第三层应用返回到第二层iconview无焦点

[复制链接]

26

主题

181

回帖

259

积分

高级会员

积分
259
发表于 2017-11-28 16:40:05 | 显示全部楼层 |阅读模式
第一层是桌面,全是iconview图标。点击系统管理进入系统管理界面,系统管理界面也全是iconview,再点击进入应用界面,比如时间设置,从时间设置退出后,焦点没在系统管理界面,接了物理键盘的,所以能够发现焦点跑到第一层界面上去了。用触摸也是一样的效果,第一层进第二层有焦点,第二层进第三层退到第二层无焦点,但是手可以直接触摸再进行操作。
部分代码如下:
第一层桌面面点击图标进第二层界面
    case ID_ICONVIEW_3: // Notifications sent by 'Iconview'
      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)
    CreateSys_Manage();
        // USER END
        break;

第二层界面建立函数

WM_HWIN CreateSys_Manage(void);
WM_HWIN CreateSys_Manage(void) {
  WM_HWIN hWin;
  hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  return hWin;
}
第二层界面的时间设置调用
  case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);
    NCode = pMsg->Data.v;
    switch(Id) {
    case ID_ICONVIEW_0: // Notifications sent by 'Iconview'
      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)
    CreateTimeSet();
        // USER END
        break;

第三层时间设置函数
WM_HWIN CreateTimeSet(void);
WM_HWIN CreateTimeSet(void) {
  WM_HWIN hWin;
  hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  return hWin;
}

第三层退出函数

    case ID_BUTTON_2: // Notifications sent by 'Exit'
      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)
    WM_InvalidateWindow(WM_GetParent(pMsg->hWin));
    GUI_EndDialog(pMsg->hWin, 0);
    WM_SetFocus(WM_GetParent(pMsg->hWin));
        // USER END
        break;
      // USER START (Optionally insert additional code for further notification handling)
      // USER END
      }
      break;
回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2017-11-28 17:10:56 | 显示全部楼层
现在是各种试啊,都不对。
回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2017-11-29 00:13:26 | 显示全部楼层
我现在把iconview图标全部移到桌面上了,进入下一级全是按钮一类控件的窗口后,再进下一级窗口,再退出,返回第二级页面,还是没焦点,焦点还是跑到桌面上了。
回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2017-11-29 00:53:24 | 显示全部楼层
新的问题算是解决了,进第三层界面的时候,用阻塞方式建立窗口,完毕后再获取按下的控件的句柄,再焦点之。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115749
QQ
发表于 2017-11-29 01:10:36 | 显示全部楼层
不好意思,楼主,刚回复你。
没有测试下我们之前在群里讨论的方法,就是关闭第3级窗口的时候,在这个窗口回调函数的WM_DELETE消息里面设置下第2级窗口的聚焦。这个比使用阻塞窗口要好些。
回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2017-11-29 14:48:50 | 显示全部楼层
不客气,我这样试了的,还是聚焦到第一层界面。好像手册上的说法是所有的所有的控件都是桌面的子元素。因为我所有的界面都是用gui builder生成的,句柄都是局部变量。所以用阻塞方式目前能解决问题。
回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2017-11-30 23:06:25 | 显示全部楼层

回 eric2013 的帖子

eric2013:不好意思,楼主,刚回复你。
没有测试下我们之前在群里讨论的方法,就是关闭第3级窗口的时候,在这个窗口回调函数的WM_DELETE消息里面设置下第2级窗口的聚焦。这个比使用阻塞窗口要好些。
(2017-11-29 01:10)
  有的窗口有定时器,用阻塞方式创建,定时器不会执行,但是不用阻塞式,反回上一级焦点跑了。用阻塞式想手工建一个定时器,但初始化窗口时进不了case WM_CREATE:,怎么办?
回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2017-11-30 23:07:52 | 显示全部楼层

回 eric2013 的帖子

eric2013:不好意思,楼主,刚回复你。
没有测试下我们之前在群里讨论的方法,就是关闭第3级窗口的时候,在这个窗口回调函数的WM_DELETE消息里面设置下第2级窗口的聚焦。这个比使用阻塞窗口要好些。
(2017-11-29 01:10)
我现在用这种方式,也相当于阻塞方式,也能用。
  hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
    WM_CreateTimer(WM_GetClientWindow(hWin), ID_SYSINFO_TIMER_TIME, 1000, 0);
  while(1)
    {
        GUI_Exec();
    }
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115749
QQ
发表于 2017-12-1 02:41:42 | 显示全部楼层

回 ccschen 的帖子

ccschen:我现在用这种方式,也相当于阻塞方式,也能用。
  hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
    WM_CreateTimer(WM_GetClientWindow(hWin), ID_SYSINFO_TIMER_TIME, 1000, 0);
&nb .. (2017-11-30 23:07)
这种方式可以的。
[s:142]
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2017-12-7 15:40:11 | 显示全部楼层
手册上写不能在回调函数里创建阻塞式对话框,用了楼主方法试了一下,但是好像执行不下去了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-16 05:06 , Processed in 0.527243 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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