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;
最新文章
- CLion 2016.2.2 注册激活码
- POJ 2528 Mayor's posters(线段树+离散化)
- C#实现:给定任意要给字符串,输出所有可能的回文的子字符串集合。
- maven中使用junit老是找不到包
- php,js清除cookie
- SQL Server with(nolock)详解
- 苹果系统直接读写 ntfs 磁盘
- Javascript 基础--数组
- Java基础——多线程
- C语言中数据类型转换的学习
- CodeIgniter框架url去index.php(转)
- Java 服务器端手机验证码sdk
- Angular组件——父组件调用子组件方法
- Ubuntu版本linux系统安装git
- eclipse get set 自动添加注释
- 365. Water and Jug Problem量杯灌水问题
- location的三种连接方式和区别
- Jetson tk1 hash sum mismatch
- 洛谷U36590搬书
- IntellJ IDEA 对于 Spring Boot2.0.2 配置文件application.properties 配置
热门文章
- php如何控制用户对图片的访问 PHP禁止图片盗链(转载)
- /bin/bash: [xxxx]: command not found
- HDU 1247 Hat’s Words (字符串匹配,暴力)
- UVA 10061 How many zero's and how many digits ? (m进制,阶乘位数,阶乘后缀0)
- WCF:百度百科
- Raspberry Pi3 ~ Eclipse中添加wiringPi 库函数
- 安卓 安装 platforms 的时候报错--访问 url 出错
- VC远控(三)磁盘显示
- html --- SVG --- javascript --- 旋转矩形
- 【Java多线程】互斥