目前没有读过ucgui的源代码,经过应用代码测试出在FRAMEWIN的控件焦点顺序是样的: html
按资源列表里建立的控件,默认将焦点落在第一个可接收焦点的控件,目前知道不可接收 测试
焦点的控件有TEXT,在FRAMEWIN上安排有如下的控件: ui
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = { spa
{ FRAMEWIN_CreateIndirect, NULL, 0, 0, 0, 128, 64, 0,0}, 3d
{ TEXT_CreateIndirect, NULL, GUI_ID_TEXT0, 25, 0, 50, 13, 0,0}, htm
{ MULTIEDIT_CreateIndirect, NULL, GUI_ID_MULTIEDIT0, 65, 0, 42, 13, 0,0}, blog
{ CHECKBOX_CreateIndirect, NULL, GUI_ID_CHECK0, 4, 4, 51, 0, 0, 0 }, 资源
{ TEXT_CreateIndirect, NULL, GUI_ID_TEXT1, 25, 15, 50, 13, 0,0}, get
{ MULTIEDIT_CreateIndirect, NULL, GUI_ID_MULTIEDIT1, 65, 15, 42, 13, 0,0}, it
{ 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;