硬汉嵌入式论坛

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

[emWin] emwinGUI  WM_KEY求助

[复制链接]

4

主题

17

回帖

29

积分

新手上路

积分
29
发表于 2014-5-19 20:03:12 | 显示全部楼层 |阅读模式
我建立了多个dialog, 首先打开第一个dialog 里面只建立button时,WM_KEY里的对GUI_KEY_ENTER消息不做反应 当dialog里多加一个EDIT的控件时,就有反应了,难道BUTTON对GUI_KEY_ENTER没反应吗?但是手册上说是可以呀求指教
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2014-5-19 20:09:00 | 显示全部楼层
不是太懂你的意思,方便把你的函数贴上来吗
回复

使用道具 举报

4

主题

17

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2014-5-19 20:14:19 | 显示全部楼层

回 eric2013 的帖子

eric2013:不是太懂你的意思,方便把你的函数贴上来吗 (2014-05-19 20:09) 
static const GUI_WIDGET_CREATE_INFO _aDialogCreate0[] = {
  { WINDOW_CreateIndirect, NULL, ID_WINDOW_0,0  , 20 ,APP_UserWin_sizex,APP_UserWin_sizey},
//    { EDIT_CreateIndirect  , "",GUI_ID_EDIT0,127,48,60,20},
//    { EDIT_CreateIndirect  , "",GUI_ID_EDIT1,127,104,60,20},
//    { EDIT_CreateIndirect  , "",GUI_ID_EDIT2,127,160,60,20},
//    { EDIT_CreateIndirect  , "",GUI_ID_EDIT3,127,216,60,20},
    { BUTTON_CreateIndirect, NULL,GUI_ID_BUTTON0,15,264,80,20},
    { BUTTON_CreateIndirect, NULL,GUI_ID_BUTTON1,375,264,80,20},
};
这是建立的dialog, 里面只有两个button
static void _cbDialog0(WM_MESSAGE * pMsg) {
   
  WM_HWIN hItem, hDlg;
    int NCode,Id,i;
    char font[20];

  hDlg = pMsg->hWin;
  switch (pMsg->MsgId) {
          case WM_INIT_DIALOG:{
                hItem = WM_GetDialogItem(hDlg, GUI_ID_BUTTON0);
                //BUTTON_SetFocussable(hItem,0);
                GB2312_to_UTF8_Str("è·¶¨",font);
                BUTTON_SetFont(hItem,GUI_GetXBF_Font());
                BUTTON_SetText(hItem,font);
               
                hItem = WM_GetDialogItem(hDlg, GUI_ID_BUTTON1);
                //BUTTON_SetFocussable(hItem,0);
                GB2312_to_UTF8_Str("è¡Ïû",font);
                BUTTON_SetFont(hItem,GUI_GetXBF_Font());
                BUTTON_SetText(hItem,font);
               
                /*--- Æeê¼ÆμÂê -----*/
                hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0);
                EDIT_SetFont(hItem,GUI_GetXBF_Font());
                EDIT_SetDecMode(hItem,0,0,100000,0,0);
                EDIT_SetSel(hItem, 0, -1);
                /*--- ÖÕÖ1ÆμÂê -----*/
                hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT1);
                EDIT_SetFont(hItem,GUI_GetXBF_Font());
                EDIT_SetDecMode(hItem,0,0,100000,0,0);
                /*--- ÆμÂê¼ä¸ô -----*/
                hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT2);
                EDIT_SetFont(hItem,GUI_GetXBF_Font());
                EDIT_SetDecMode(hItem,0,0,100000,0,0);
                /*--- Ãa¸Ë3¤¶è -----*/
                hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT3);
                EDIT_SetFont(hItem,GUI_GetXBF_Font());
                EDIT_SetFloatMode(hItem,0.0,0.0,99.99,2,0);
               
                /*------ !!!ó|óÃ3ìDò×′쬱äá¿3õê¼»ˉ!!! ------*/
                init_collectobj(&app);
                break;
            }
            case WM_NOTIFY_PARENT:{
                break;
            }
            case WM_PAINT:{
                GUI_SetColor(CtoBGR(BK));
                GUI_FillRect(0,0,APP_UserWin_sizex,APP_UserWin_sizey);
                GUI_SetColor(CtoBGR(FK));
                GUI_FillRect(7,7,APP_UserWin_sizex-7,APP_UserWin_sizey-7);
                GUI_SetPenSize(3);
                GUI_SetColor(CtoBGR(SK));
                GUI_DrawRect(7,7,APP_UserWin_sizex-7,APP_UserWin_sizey-7);
                GUI_SetColor(CtoBGR(IK));
                GUI_DrawRect(8,39,APP_UserWin_sizex-8,39);
                GUI_DrawRect(8,182,APP_UserWin_sizex-8,182);

                GUI_ShowFont_At("Æeê¼ÆμÂê(KHz):",15,50,CtoBGR(GUI_WHITE));
                GUI_ShowFont_At("ÖÕÖ1ÆμÂê(KHz):",15,106,CtoBGR(GUI_WHITE));
                GUI_ShowFont_At("ÆμÂê¼ä¸ô(KHz):",15,162,CtoBGR(GUI_WHITE));
                GUI_ShowFont_At("Ãa¸Ë3¤¶è(m):",15,218,CtoBGR(GUI_WHITE));
                //hTimer4 = WM_CreateTimer(hDlg,4,PowerCheck_Time,0);
                //hTimer5 = WM_CreateTimer(hDlg,5,1000,0);
                break;
            }
            case WM_KEY:{
                printf("WM_KEY _cbDialog0 \\r\\n");
                switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) {
                    case GUI_KEY_ESCAPE:
                        if(!MesgBox_GetStatus())/*èç1ûÏûÏ¢oD×óòѾ-1رÕ2ÅÔêDí′ò¿aDÂoD×ó*/
                        {
                            app.mesgbox_lockret = 1;
                            Create_MesgBox(" íË3öêy¾Y2é¼ˉ£¿","        êÇ·ñíË3ö?",&Dialog0,MESGBOX_DoRet);
                        }                    
                        break;
                    case GUI_KEY_ENTER:
                        printf("GUI_KEY_ENTER _cbDialog0 \\r\\n");
//                        if(!EDIT_GetValue(WM_GetDialogItem(hDlg, GUI_ID_EDIT1))){
//                            app.mesgbox_lockret = 0;
//                            Create_MesgBox("       ÖÕÖ1ÆμÂê2»ÄüÎa0KHz!","",&Dialog0,MESGBOX_DoRet);   
//                        }else if(!EDIT_GetValue(WM_GetDialogItem(hDlg, GUI_ID_EDIT2))){
//                            app.mesgbox_lockret = 0;
//                            Create_MesgBox("   ÆμÂê¼ä¸ô2»ÄüÎa0KHz!","",&Dialog0,MESGBOX_DoRet);   
//                        }else if(!EDIT_GetValue(WM_GetDialogItem(hDlg, GUI_ID_EDIT3))){
//                            app.mesgbox_lockret = 0;
//                            Create_MesgBox("      Ãa¸Ë3¤¶è2»ÄüÎa0m!","",&Dialog0,MESGBOX_DoRet);   
//                        }else{
//                                create_workflie(app.fullname);/*èç1û1¤×÷Ãæêy¾YÎļtòѾ-′æÔú*/
//                                read_flie(app.fullname,0,(void*)workobj,sizeof(WORKOBJ));
//                                    /*èç1ûÕaêǸöûóD′æóDDÅÏ¢μÄDÂÎļtÔò3õê¼»ˉ1¤×÷Ãæ¶ÔÏó*/
//                                workobj->workflag = 0;
//                                workobj->workname = app.fullname;
//                                workobj->Anchor_Len = Ads->Anchor_Len;
//                                Time_GetTimeString(workobj->date,Show_YMD);
//                                Time_GetTimeString(workobj->time,Show_HMS);
//                                workobj->Start_Fre = EDIT_GetValue(WM_GetDialogItem(hDlg, GUI_ID_EDIT0));
//                                workobj->End_Fre = EDIT_GetValue(WM_GetDialogItem(hDlg, GUI_ID_EDIT1));
//                                workobj->Fre_Div = EDIT_GetValue(WM_GetDialogItem(hDlg, GUI_ID_EDIT2));   
//                                workobj->Ancor_Len_Pre = EDIT_GetValue(WM_GetDialogItem(hDlg, GUI_ID_EDIT3));   
//                                Open_Dialog(&Dialog1,_aDialogCreate1,GUI_COUNTOF(_aDialogCreate1), _cbDialog1);
//                                WM_SetFocus(Dialog1);
//                                }
                                Open_Dialog(&Dialog1,_aDialogCreate1,GUI_COUNTOF(_aDialogCreate1), _cbDialog1);
                                WM_SetFocus(Dialog1);
                            break;
                    default:break;
                }
                break;   
            }
   
            }
            default: WM_DefaultProc(pMsg);
  }
}   
回调函数中case WM_KEY:里面有两个消息GUI_KEY_ESCAPE和GUI_KEY_ENTER 这个时候我通过按键发消息GUI_KEY_ENTER  回调函数GUI_KEY_ENTER 里没反应,但是通过按键发消息GUI_KEY_ESCAPE 回调函数GUI_KEY_ESCAPE 里有反应  

我不太理解,为啥回调函数GUI_KEY_ENTER 里没反应???
请大神指点
回复

使用道具 举报

4

主题

17

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2014-5-19 20:25:46 | 显示全部楼层
求大神指教呀!!!!!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2014-5-19 20:51:20 | 显示全部楼层
你理解错了,WM_KEY消息主要是用于外部按键的,看我的emWin教程吧,主要是回调机制那章节。
回复

使用道具 举报

4

主题

17

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2014-5-19 22:27:18 | 显示全部楼层

回 eric2013 的帖子

eric2013:你理解错了,WM_KEY消息主要是用于外部按键的,看我的emWin教程吧,主要是回调机制那章节。
 (2014-05-19 20:51) 
我就是用的外部按键映射的
回复

使用道具 举报

4

主题

17

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2014-5-19 22:27:57 | 显示全部楼层

回 xiaoqzq 的帖子

xiaoqzq:我就是用的外部按键映射的 (2014-05-19 22:27) 
检测到按键按下后,就sendmessage(xxx,1)
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
发表于 2016-6-11 15:16:46 | 显示全部楼层
请问楼主问题解决了吧,能不能分享一下,我遇到楼主相同的情况,我在使用DROPDOWN控件时,创建GUI_CreateDialogBox,外部按键GUI_KEY_ESCAPE 可以识别,GUI_KEY_ENTER一直检测不到,不知为何。[s:130]
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2016-6-12 00:14:21 | 显示全部楼层

回 wlp00574 的帖子

wlp00574:
请问楼主问题解决了吧,能不能分享一下,我遇到楼主相同的情况,我在使用DROPDOWN控件时,创建GUI_CreateDialogBox,外部按键GUI_KEY_ESCAPE 可以识别,GUI_KEY_ENTER一直检测不到,不知为何。[s:130]  
你的按键消息发送是不是有问题,DropDown控件仅支持下面这两种消息,另外你要聚焦到这个控件上面,消息才可以发到这个控件上面:
12.png
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
发表于 2016-6-14 10:25:08 | 显示全部楼层
TO:版主
现在用 这条语句 slTemp = WM_SetFocus(hControlList[0]); 发现slTemp = 1,为非零值
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
发表于 2016-6-14 10:30:47 | 显示全部楼层
TO:版主
现在用 这条语句 slTemp = WM_SetFocus(hControlList[0]); 发现slTemp = 1,为非零值
根据WM_SetFocus() 描述,返回值如果窗口接收焦点则为0,否则为0以外的值.
请问遇到这种问题可能会是什么问题呢?谢谢!
按键发送应该没问题,创建GUI_CreateDialogBox,用到三个小控件分别是
static const GUI_WIDGET_CREATE_INFO _aScaleUnit[] =
{
    {WINDOW_CreateIndirect, "", LABEL_APP_TYPE_WIN, 0, 0, 128, 64, FRAMEWIN_CF_MOVEABLE},
    {TEXT_CreateIndirect, "", LABEL_APP_TYPE_TITLE, 80, LINE0_YPOS, 48, GUI_TEXT_HEIGHT, TEXT_CF_RIGHT},
    /* */
    {TEXT_CreateIndirect, "", LABEL_APP_TYPE_ONE, 2, CH_SECOND_HEIGHT, 26, GUI_CHINESE_TEXT_HEIGHT, TEXT_CF_LEFT|TEXT_CF_VCENTER},
    {DROPDOWN_CreateIndirect, "", LIST_APP_TYPE_ONE, 80, CH_THIRD_HEIGHT, 44, GUI_DROPDOWN_HEIGHT+8, 0},
};
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
发表于 2016-6-15 14:45:42 | 显示全部楼层
继续版主有空时间帮我看看)
1、关于之前提的问题 slTemp = WM_SetFocus(hControlList[0]); 发现slTemp = 1,为非零值
原因是按键处理函数采用GUI_SendKeyMsg(GuuiKeyData.ucDat[0], 1);  后来改回GUI_StoreKeyMsg(GuuiKeyData.ucDat[0], 1); 问题1 现象消失,控件焦点返回为0,即设置成功。
2、创建GUI_CreateDialogBox,还是无法响GUI_KEY_ENTER,相关程序如下:
void WF_CreateSetUp_ScaleUnitWin (WM_HWIN hWin)
{
    WINDOW_SetDefaultBkColor(GUI_BLACK);
    WIDGET_SetDefaultEffect_3D();
    /*  */
    hUnitTypeWin = GUI_CreateDialogBox(_aScaleUnit, GUI_COUNTOF(_aScaleUnit), &_cbScaleUnitWinProc, hWin, 0, 0);
}

static const GUI_WIDGET_CREATE_INFO _aScaleUnit[] =
{
    {WINDOW_CreateIndirect, "", LABEL_APP_TYPE_WIN, 0, 0, 128, 64, FRAMEWIN_CF_MOVEABLE},
    {TEXT_CreateIndirect, "", LABEL_APP_TYPE_TITLE, 80, LINE0_YPOS, 48, GUI_TEXT_HEIGHT, TEXT_CF_RIGHT},
    /* */
    {TEXT_CreateIndirect, "", LABEL_APP_TYPE_ONE, 2, CH_SECOND_HEIGHT, 26, GUI_CHINESE_TEXT_HEIGHT, TEXT_CF_LEFT|TEXT_CF_VCENTER},
    {DROPDOWN_CreateIndirect, "", LIST_APP_TYPE_ONE, 80, CH_THIRD_HEIGHT, 44, GUI_DROPDOWN_HEIGHT+8, 0},
};

static void _cbScaleUnitWinProc (WM_MESSAGE * pMsg)
{
      int siKey;
    static INT32S slTemp=0;
      /*  */
      switch (pMsg->MsgId)
      {
          case WM_INIT_DIALOG:
        {
            hUnitTypeWin = pMsg->hWin;
            ssinControlIndex = 0;
            ssiFocusFlg = 0;
            ssiCount = 0;
            WFScaleUnitWin_InitWinContrls(hUnitTypeWin);
            /*  */
            WFSetUpWin_ShowFirstPage();
            WFLongCut_SetFocusText(hLabelList[0]);          /* */
            slTemp = WM_SetFocus(hControlList[0]);
//            WM_SetFocus(hUnitTypeWin);
//            WM_SetFocus(pMsg->hWin);
            break;
        }
        case WM_PAINT:
        {
            GUI_Clear();
            break;
        }
        case WM_KEY:
        {
            siKey = ((WM_KEY_INFO*)(pMsg->Data.p))->Key;
              switch (siKey)
               {
                case KEY_GUI_CLEAR:
                {
                    WM_SetFocus(WM_GetParent(hUnitTypeWin));
                    GUI_EndDialog(hUnitTypeWin, 1);
                    WFSetUpWin_ShowFirstPage();
                    break;
                }
                case KEY_GUI_ENTER:
                {
                    WFLongCut_SetNoFocusText(hLabelList[0]);
                    WM_SetFocus(hControlList[0]);   
                    break;
                }
            }
            break;
        }
        default:
        {
            WM_DefaultProc(pMsg);
            break;
        }
    }
}

版主帮我分析一下,这个问题我解决了很久,还有请问有没有办法可以在GUI_CreateDialogBox下,操作任务外部机械按键都可以在回调函数中响应。
万分感谢![s:142]
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2016-6-16 11:13:45 | 显示全部楼层

回 wlp00574 的帖子

wlp00574:继续版主有空时间帮我看看)
1、关于之前提的问题 slTemp = WM_SetFocus(hControlList[0]); 发现slTemp = 1,为非零值
原因是按键处理函数采用GUI_SendKeyMsg(GuuiKeyData.ucDat[0], 1);  后来改回GUI_StoreKeyMsg(GuuiKeyData.ucDat[0], 1); 问题1 现象消失,控件焦点 .. (2016-06-15 14:45) 
没看出什么问题,不行就发送自定义消息过去操作吧。
回复

使用道具 举报

2

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2016-8-10 08:55:16 | 显示全部楼层
我也出现了这个问题,是不是对话框不支持
回复

使用道具 举报

5

主题

109

回帖

124

积分

初级会员

积分
124
发表于 2016-9-19 22:19:23 | 显示全部楼层

回 eric2013 的帖子

eric2013:没看出什么问题,不行就发送自定义消息过去操作吧。 (2016-06-16 11:13) 
emwin 的确有这个问题,但不知道是什么原因,如果窗口中只有text控件的话,
设置当前窗口为输入焦点WM_SetFocus后,
GUI_SendKeyMsg 发送的消息,也进不了窗口回调例程里,所以也就处理不了这个按键了,但如果这个窗口中有edit这类响应按键的控件的话,就能够进入,不知道是什么原因,求大神指点
回复

使用道具 举报

5

主题

109

回帖

124

积分

初级会员

积分
124
发表于 2016-9-19 22:22:37 | 显示全部楼层
兄弟,你的这个问题解决了么,遇到同样的问题,窗口中无edit这种控件时,进入不了回调例程,如果有的话就可以进入,不知道是什么情况
回复

使用道具 举报

7

主题

70

回帖

91

积分

初级会员

积分
91
发表于 2016-9-20 13:25:51 | 显示全部楼层
我也遇到这样的问题,窗口刚创建,外部按键GUI_KEY_ENTER有反应;但如果操作按钮键盘,GUI_KEY_ENTER就没有反应了。
回复

使用道具 举报

12

主题

59

回帖

95

积分

初级会员

积分
95
发表于 2017-9-28 16:02:25 | 显示全部楼层
谁能告诉我GUI_ID_USER是个什么玩意儿,为什么数据手册不对此做出解释?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2017-9-29 09:22:56 | 显示全部楼层

回 pjzmj2012 的帖子

pjzmj2012:谁能告诉我GUI_ID_USER是个什么玩意儿,为什么数据手册不对此做出解释? (2017-09-28 16:02) 
官方对于控件定义了几组ID,这个是提供出来供用户安排ID的,因为官方定义的太少了,不够用。
回复

使用道具 举报

12

主题

59

回帖

95

积分

初级会员

积分
95
发表于 2017-10-27 09:21:17 | 显示全部楼层

回 eric2013 的帖子

eric2013:官方对于控件定义了几组ID,这个是提供出来供用户安排ID的,因为官方定义的太少了,不够用。 (2017-09-29 09:22) 
此 ID 可复用吗?
回复

使用道具 举报

8

主题

59

回帖

83

积分

初级会员

积分
83
发表于 2017-10-27 17:17:15 | 显示全部楼层

回 pjzmj2012 的帖子

pjzmj2012:此 ID 可复用吗? (2017-10-27 09:21) 
这个要看作用域的,相同作用域下要区分开
回复

使用道具 举报

5

主题

95

回帖

110

积分

初级会员

积分
110
发表于 2022-5-24 18:31:37 | 显示全部楼层
hejiang177 发表于 2016-9-19 22:19
emwin 的确有这个问题,但不知道是什么原因,如果窗口中只有text控件的话,
设置当前窗口为输入焦点WM_Set ...

确实 我现在用6.24还是同样的问题
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-15 07:36 , Processed in 0.065014 second(s), 33 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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