• emWin(ucGui) MULTIEDIT控件的按键响应处理 worldsing


    目前没有读过ucgui的源代码,通过应用代码测试出在FRAMEWIN的控件焦点顺序是样的:

    按资源列表里创建的控件,默认将焦点落在第一个可接收焦点的控件,目前知道不可接收

    焦点的控件有TEXT,在FRAMEWIN上安排有以下的控件:

     

    static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {

        { FRAMEWIN_CreateIndirect, NULL, 0, 0, 0, 128, 64, 0,0},

        { TEXT_CreateIndirect, NULL, GUI_ID_TEXT0, 25, 0, 50, 13, 0,0},

        { MULTIEDIT_CreateIndirect, NULL, GUI_ID_MULTIEDIT0, 65, 0, 42, 13, 0,0},

        { CHECKBOX_CreateIndirect, NULL, GUI_ID_CHECK0, 4, 4, 51, 0, 0, 0 },

        { TEXT_CreateIndirect, NULL, GUI_ID_TEXT1, 25, 15, 50, 13, 0,0},

        { MULTIEDIT_CreateIndirect, NULL, GUI_ID_MULTIEDIT1, 65, 15, 42, 13, 0,0},

        { TEXT_CreateIndirect, NULL, GUI_ID_TEXT2, 0, 30, 64, 13, 0,0},

        { MULTIEDIT_CreateIndirect, NULL, GUI_ID_MULTIEDIT2, 65, 30, 42, 13, 0,0},

    };

     

    从列表中看出默认的窗口焦点是CHECKBOX控件,如果将CHECKBOX0 删除,那么默认的焦点是MULTIEIDT0

    static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {

        { FRAMEWIN_CreateIndirect, NULL, 0, 0, 0, 128, 64, 0,0},

        { TEXT_CreateIndirect, NULL, GUI_ID_TEXT0, 25, 0, 50, 13, 0,0},

        { MULTIEDIT_CreateIndirect, NULL, GUI_ID_MULTIEDIT0, 65, 0, 42, 13, 0,0},

     

        { TEXT_CreateIndirect, NULL, GUI_ID_TEXT1, 25, 15, 50, 13, 0,0},

        { MULTIEDIT_CreateIndirect, NULL, GUI_ID_MULTIEDIT1, 65, 15, 42, 13, 0,0},

        { TEXT_CreateIndirect, NULL, GUI_ID_TEXT2, 0, 30, 64, 13, 0,0},

        { MULTIEDIT_CreateIndirect, NULL, GUI_ID_MULTIEDIT2, 65, 30, 42, 13, 0,0},

    };

     

    那么问题就来了,如果焦点在MULTIEIDT控件上,想以ESC做为本窗口的销毁退出处理,发现在FRAMEWIN的回调里无法收到ESC键抬起的消息,即:

         case WM_KEY:

             switch (((WM_KEY_INFO *)(pMsg->Data.p))->Key){

         case GUI_KEY_ESCAPE:

             if(((WM_KEY_INFO *)(pMsg->Data.p))->PressedCnt == 0) //起键判断

                 窗口销毁操作;

     

    在MultiEdit里当按下ESC键时有按下((WM_KEY_INFO *)(pMsg->Data.p))->PressedCnt == 1,但是没有抬起:((WM_KEY_INFO *)(pMsg->Data.p))->PressedCnt == 0,如果一按键触发退出会导致连级退出,参考文章:

    http://www.cnblogs.com/worldsing/p/4165919.html

     

    所以代码无法运行到窗口销毁的部分,我尝试将焦点落在其他控件上可以销毁窗口,初步怀疑MULTIEDIT把起键消息过滤了,如果窗口上只有MULTIEDIT控件该如何实现这样的功能?

     

    处理办法是收到ESC键按下的消息是,触发定时器在指定的时间内退出并销毁窗口:

     

        case WM_KEY:

            switch (((WM_KEY_INFO *)(pMsg->Data.p))->Key){

                case GUI_KEY_ESCAPE:

                    WM_CreateTimer(WM_GetClientWindow(hWin), 0, 100, 0);

                    break;

            }

            break;

        case WM_TIMER:

            WIN_Exit(0);

            break;    

     

     

  • 相关阅读:
    bootstrap中nav-fixed-top和nav-static-top的区别
    bootstrap aria
    pixi学习总结
    我的代码需要随时备份,并且保证最新版与别人协同开发?Git与Github一起用啊
    自己本地的代码,如何随时备份?随时找回上个备份?版本控制工具Git啊
    自己的代码,如何跟别人协同开发?用GitHub啊
    函数放到onload里面,在html里面执行函数会报错-----作用域和闭包相关问题
    使用CSS实现空心的向上向下的箭头
    两个input放一行不能对齐
    发现一个h5网站,爱果果
  • 原文地址:https://www.cnblogs.com/worldsing/p/4180622.html
Copyright © 2020-2023  润新知