硬汉嵌入式论坛

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

[emWin] 实体按键如何把焦点切换到对话框上?

[复制链接]

22

主题

96

回帖

162

积分

初级会员

积分
162
发表于 2015-8-3 15:41:54 | 显示全部楼层 |阅读模式
我做了一个主界面,主界面上有几个图标,通过实体按键可以打开相应的对话框,可是没法对对话框上的控件进行操作,也没法关掉对话框,按键发送 GUI_SendKeyMsg(GUI_KEY_TAB,1)消息也没用,是焦点没切换到对话框上的原因吗?该如何解决呢?

static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {   
  { FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 320, 219, 0, 0x0, 0 },
  { SPINBOX_CreateIndirect, "Spinbox", ID_SPINBOX_0, 95, 160, 60, 30, 0, 0x0, 0 },
  { SPINBOX_CreateIndirect, "Spinbox", ID_SPINBOX_1, 175, 160, 60, 30, 0, 0x0, 0 },
  { SPINBOX_CreateIndirect, "Spinbox", ID_SPINBOX_5, 5, 160, 70, 30, 0, 0x0, 0 },
  { SPINBOX_CreateIndirect, "Spinbox", ID_SPINBOX_2, 5, 100, 60, 30, 0, 0x0, 0 },
  { SPINBOX_CreateIndirect, "Spinbox", ID_SPINBOX_3, 85, 100, 60, 30, 0, 0x0, 0 },
    { SPINBOX_CreateIndirect, "Spinbox", ID_SPINBOX_8, 165, 100, 60, 30, 0, 0x0, 0 },
    { SPINBOX_CreateIndirect, "Spinbox", ID_SPINBOX_6, 5, 25, 60, 30, 0, 0x0, 0 },
  { SPINBOX_CreateIndirect, "Spinbox", ID_SPINBOX_7, 85, 25, 60, 30, 0, 0x0, 0 },
  { SPINBOX_CreateIndirect, "Spinbox", ID_SPINBOX_4, 165, 25, 60, 30, 0, 0x0, 0 },
  { SPINBOX_CreateIndirect, "Spinbox", ID_SPINBOX_9, 245, 25, 60, 30, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "Text", ID_TEXT_0, 8, 140, 80, 20, 0, 0x64, 0 },
  { TEXT_CreateIndirect, "Text", ID_TEXT_1, 5, 5, 80, 20, 0, 0x0, 0 },
  { TEXT_CreateIndirect, "Text", ID_TEXT_2, 6, 80, 80, 20, 0, 0x64, 0 },
  { TEXT_CreateIndirect, "Text", ID_TEXT_3, 6, 55, 80, 20, 0, 0x0, 0 },
  { TEXT_CreateIndirect, "Text", ID_TEXT_4, 87, 55, 80, 20, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "Text", ID_TEXT_5, 167, 55, 80, 20, 0, 0x0, 0 },
  { TEXT_CreateIndirect, "Text", ID_TEXT_6, 247, 55, 80, 20, 0, 0x0, 0 },
  { BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 245, 228, 80, 20, 0, 0x0, 0 },
  { BUTTON_CreateIndirect, "Button", ID_BUTTON_1, 253, 181, 55, 30, 0, 0x0, 0 },
  // USER START (Optionally insert additional widgets)
  // USER END
};

响应按键消息的回调
    WM_HWIN hDlg;
    hDlg = pMsg->hWin;
    hDlg = WM_GetDialogItem(pMsg->hWin, ID_FRAMEWIN_0);
       case WM_KEY:
            switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
        case GUI_KEY_ESCAPE:
                    GUI_EndDialog(hDlg, 1);
                    break;
               
                case GUI_KEY_ENTER:
                    GUI_EndDialog(hDlg, 0);
                    break;
            }
            break;

这是其中一个图标对应的对话框
void STemWin_Time_Setting(void)
{
  WM_HWIN hWin;
   hWin = GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbDialog, 0, 0, 21);
   WM_SetFocus(hWin);
}

按键任务
void KEY_Task(void * pdata)
{
    while (1)
    {
        KEY_NewScan();
        if (Trg & KEY_OK)
        {
               GUI_SendKeyMsg(GUI_KEY_ENTER,1);
        }
        else if (Trg & KEY_RIGHT)
        {
            GUI_SendKeyMsg(GUI_KEY_RIGHT,1);
        }
        else if (Trg & KEY_LEFT)
        {
              GUI_SendKeyMsg(GUI_KEY_TAB,1);
//            GUI_StoreKeyMsg(GUI_KEY_LEFT,1);
        }
        else if (Trg & KEY_UP)
        {
            GUI_SendKeyMsg(GUI_KEY_UP,1);
        }
        else if (Trg & KEY_DW)
        {
//            GUI_StoreKeyMsg(GUI_KEY_DOWN,1);
        }
        OSTimeDlyHMSM(0, 0, 0, 20);  //延时   
    };
}
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2015-8-3 16:42:02 | 显示全部楼层
有个函数专门设定焦点的。 WM_Setfoucs之类的,搜索一下帮助文档。
回复

使用道具 举报

22

主题

96

回帖

162

积分

初级会员

积分
162
 楼主| 发表于 2015-8-3 17:05:23 | 显示全部楼层

回 caicaptain2 的帖子

caicaptain2:有个函数专门设定焦点的。 WM_Setfoucs之类的,搜索一下帮助文档。 (2015-08-03 16:42)
有用啊
void STemWin_Time_Setting(void)
{
  WM_HWIN hWin;
   hWin = GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbDialog, 0, 0, 21);
   WM_SetFocus(hWin);
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
发表于 2015-8-3 18:26:06 | 显示全部楼层
注意,你这里创建的是阻塞式窗口
也即是说
void STemWin_Time_Setting(void)
{
  WM_HWIN hWin;
   hWin = GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbDialog, 0, 0, 21);
   WM_SetFocus(hWin);   只有有关闭了上面创建的对话框,这个函数才会得到执行。
}

你可以在你创建的对话框回调函数的WM_CRAETE消息里面调用下 WM_SetFocus
回复

使用道具 举报

22

主题

96

回帖

162

积分

初级会员

积分
162
 楼主| 发表于 2015-8-4 09:54:30 | 显示全部楼层
版主,我有点不太理解什么时候用阻塞,什么时候用非阻塞啊?我芯片RAM比较小,我用GUI_CreateDialogBox的话按键好像有反应,但GUI_ALLOC_GetNumUsedBytes()占用率达百分之九十四,已经接近死机的边缘了,用 GUI_ExecDialogBox占用率只有百分之六十五,但按键没反应。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
发表于 2015-8-4 10:26:10 | 显示全部楼层

回 crazymcu 的帖子

crazymcu:版主,我有点不太理解什么时候用阻塞,什么时候用非阻塞啊?我芯片RAM比较小,我用GUI_CreateDialogBox的话按键好像有反应,但GUI_ALLOC_GetNumUsedBytes()占用率达百分之九十四,已经接近死机的边缘了,用 GUI_ExecDialogBox占用率只有百分之六十五,但按键没反应。 (2015-08-04 09:54) 
都可以的,那个方便用那个。你可以在你对话框的回调函数的WM_CRAETE消息里面调用下 WM_SetFocus,试试效果
回复

使用道具 举报

22

主题

96

回帖

162

积分

初级会员

积分
162
 楼主| 发表于 2015-8-4 10:34:21 | 显示全部楼层

回 eric2013 的帖子

eric2013:都可以的,那个方便用那个。你可以在你对话框的回调函数的WM_CRAETE消息里面调用下 WM_SetFocus,试试效果 (2015-08-04 10:26)
是WM_CREATE吧,试过了,打开图标的时候就死机了
回复

使用道具 举报

22

主题

96

回帖

162

积分

初级会员

积分
162
 楼主| 发表于 2015-8-4 10:48:15 | 显示全部楼层

回 eric2013 的帖子

eric2013:都可以的,那个方便用那个。你可以在你对话框的回调函数的WM_CRAETE消息里面调用下 WM_SetFocus,试试效果 (2015-08-04 10:26)
哦,死机是忘了加break; 不过还是不行,在初始化那里可以给对话框上的控件加焦点,但焦点不能移动,也不能作其他操作。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
发表于 2015-8-4 11:56:05 | 显示全部楼层

回 crazymcu 的帖子

crazymcu:哦,死机是忘了加break; 不过还是不行,在初始化那里可以给对话框上的控件加焦点,但焦点不能移动,也不能作其他操作。 (2015-08-04 10:48) 
测试下创建的是非阻塞的对话框,看看能切换吗。另外你的GUI主函数里面是调用的GUI_Delay类似的函数的吧。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2015-8-4 16:19:27 | 显示全部楼层

回 crazymcu 的帖子

crazymcu:是WM_CREATE吧,试过了,打开图标的时候就死机了 (2015-08-04 10:34) 
初始化对焦框之类的,还是在WM_INITIAL消息中处理比较好吧。
回复

使用道具 举报

22

主题

96

回帖

162

积分

初级会员

积分
162
 楼主| 发表于 2015-8-4 17:04:08 | 显示全部楼层

回 eric2013 的帖子

eric2013:测试下创建的是非阻塞的对话框,看看能切换吗。另外你的GUI主函数里面是调用的GUI_Delay类似的函数的吧。 (2015-08-04 11:56)
找到原因了,第一个没响应按键消息是因为按键任务优先级需高于界面任务优先级,第二个关不掉窗口要把hDlg = WM_GetDialogItem(pMsg->hWin, ID_FRAMEWIN_0);改成hDlg = pMsg->hWin;
都是些细节问题,做界面真的不容易啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
发表于 2015-8-5 09:18:18 | 显示全部楼层

回 crazymcu 的帖子

crazymcu:找到原因了,第一个没响应按键消息是因为按键任务优先级需高于界面任务优先级,第二个关不掉窗口要把hDlg = WM_GetDialogItem(pMsg->hWin, ID_FRAMEWIN_0);改成hDlg = pMsg->hWin;
都是些细节问题,做界面真的不容易啊 (2015-08-04 17:04) 
非常感谢告知结果。我以前做的都是按键任务的优先级高于界面任务。[s:142]
回复

使用道具 举报

17

主题

177

回帖

233

积分

高级会员

积分
233
QQ
发表于 2016-3-3 15:43:57 | 显示全部楼层
感谢分享经验,学习了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 08:44 , Processed in 0.315774 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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