zoukankan      html  css  js  c++  java
  • 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;    

     

     

  • 相关阅读:
    设计模式之四(抽象工厂模式第二回合)
    C# try catch finally
    设计模式之三(工厂方法模式)
    C# XML与Json之间的相互转换
    Google免费的SVN服务器管理VS2010代码
    设计模式之四(抽象工厂模式第一回合)
    MVC项目开发中那些用到的知识点(Jquery ajax提交Json后台处理)
    设计模式之四(抽象工厂模式第三回合)
    设计模式之二(简单工厂模式)
    Jquery的$命名冲突
  • 原文地址:https://www.cnblogs.com/worldsing/p/4180622.html
Copyright © 2011-2022 走看看