目前没有读过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;    

 

 

最新文章

  1. CLion 2016.2.2 注册激活码
  2. POJ 2528 Mayor's posters(线段树+离散化)
  3. C#实现:给定任意要给字符串,输出所有可能的回文的子字符串集合。
  4. maven中使用junit老是找不到包
  5. php,js清除cookie
  6. SQL Server with(nolock)详解
  7. 苹果系统直接读写 ntfs 磁盘
  8. Javascript 基础--数组
  9. Java基础——多线程
  10. C语言中数据类型转换的学习
  11. CodeIgniter框架url去index.php(转)
  12. Java 服务器端手机验证码sdk
  13. Angular组件——父组件调用子组件方法
  14. Ubuntu版本linux系统安装git
  15. eclipse get set 自动添加注释
  16. 365. Water and Jug Problem量杯灌水问题
  17. location的三种连接方式和区别
  18. Jetson tk1 hash sum mismatch
  19. 洛谷U36590搬书
  20. IntellJ IDEA 对于 Spring Boot2.0.2 配置文件application.properties 配置

热门文章

  1. php如何控制用户对图片的访问 PHP禁止图片盗链(转载)
  2. /bin/bash: [xxxx]: command not found
  3. HDU 1247 Hat’s Words (字符串匹配,暴力)
  4. UVA 10061 How many zero's and how many digits ? (m进制,阶乘位数,阶乘后缀0)
  5. WCF:百度百科
  6. Raspberry Pi3 ~ Eclipse中添加wiringPi 库函数
  7. 安卓 安装 platforms 的时候报错--访问 url 出错
  8. VC远控(三)磁盘显示
  9. html --- SVG --- javascript --- 旋转矩形
  10. 【Java多线程】互斥