|
本帖最后由 caicaptain2 于 2018-8-29 10:20 编辑
原来是528版本,edit控件,disable后,可以通过tab键切换焦点。
换成540后,edit控件,disable后,tab键只能切换button的焦点,不能切换edit的焦点。 但是可以使用WM_Setfocus()切换焦点到edit上。 查了用户手册,没有发现明显区别。
------------------------------------结帖-----2018-8-29------------------------------------
经过反复摸索,找到了emwin中文档没有介绍过,但是在Widget.h内存在的函数。 自定义了两个函数,代替tab和backtab键。
主要使用了WM_GetNextSibling()获得下一个控件,使用WIDGET_GetState()获得控件能否“有效”聚焦。
- <div>void User_WidgetNextFocus(const GUI_WIDGET_CREATE_INFO paWidget[],WM_MESSAGE *pMsg,int32_t WidgetNumber) //用在WM_KEY消息中,选择下一个控件的焦点。
- {
- WM_HWIN hItem;
- int Id;
- uint16_t i=0;
- hItem=WM_GetFocusedWindow(); //获得当前聚焦的控件句柄
- do{ hItem=WM_GetNextSibling(hItem); //获得下一个控件的句柄,相对当前的聚焦控件
- if(hItem==0) //说明,没有上一个控件的时候,需要设定到最后的控件,以便焦点循环。
- {Id=paWidget[1].Id;hItem=WM_GetDialogItem(pMsg->hWin,Id);} //因为资源列表的第一行是父窗口,不是控件。得从第二行开始。
- i=WIDGET_GetState(hItem); //获得控件的状态参数。一个16位整形。参考wdiget.h里面的定义States
- } while((i&WIDGET_STATE_FOCUSABLE)==0);
- WM_SetFocus(hItem);
- }</div><div>
- //WdigetNumber 必须得加上,因为传递数组时,需要知道数组大小。
- void User_WidgetPrevFocus(const GUI_WIDGET_CREATE_INFO paWidget[],WM_MESSAGE *pMsg,int32_t WidgetNumber) //用在WM_KEY消息中,选择上一个控件的焦点。
- {
- WM_HWIN hItem;
- int Id;
- uint16_t i=0;
- hItem=WM_GetFocusedWindow(); //获得当前聚焦的控件句柄
- do{ hItem=WM_GetPrevSibling(hItem); //获得上一个控件的句柄,相对当前的聚焦控件
- if(hItem==0) //说明,没有上一个控件的时候,需要设定到最后的控件,以便焦点循环。
- {Id=paWidget[WidgetNumber-1].Id;hItem=WM_GetDialogItem(pMsg->hWin,Id);}
- i=WIDGET_GetState(hItem); //获得控件的状态参数。一个16位整形。参考wdiget.h里面的定义States
- } while((i&WIDGET_STATE_FOCUSABLE)==0);
- WM_SetFocus(hItem);
- }</div>
复制代码 使用的时候,在对话框的回调函数中,找到WM_KEY消息下:(_aDialogCreate是对话框资源列表数组。用GUIBuild创建时的默认名字)
- case WM_KEY:
- switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
- {
- case GUI_KEY_LEFT:
- //GUI_SendKeyMsg(GUI_KEY_BACKTAB,1);
- User_WidgetPrevFocus(_aDialogCreate,pMsg,GUI_COUNTOF(_aDialogCreate));
- break;
- case GUI_KEY_RIGHT:
- //GUI_SendKeyMsg(GUI_KEY_TAB,1);
- User_WidgetNextFocus(_aDialogCreate,pMsg,GUI_COUNTOF(_aDialogCreate));
- break;
- case GUI_KEY_UP:
- //GUI_SendKeyMsg(GUI_KEY_BACKTAB,1);
- User_WidgetPrevFocus(_aDialogCreate,pMsg,GUI_COUNTOF(_aDialogCreate));
- break;
- case GUI_KEY_DOWN:
- //GUI_SendKeyMsg(GUI_KEY_TAB,1);
- User_WidgetNextFocus(_aDialogCreate,pMsg,GUI_COUNTOF(_aDialogCreate));
- break;
- }
- break;
复制代码
|
|