UCGUI实现滑屏的设计思路
UCGUI是一个轻量级的界面系统,即使如此,我们仍然可以实现一些令人惊喜的界面操作,比如针对一些多窗体,稍作处理,我们就可以实现譬如现代掌上设备常见的滑屏操作。操作要点如下:1.定义两个左右滑屏跳接的窗体(或对话框,这里以对话框举例)。
比如,hWin1,hWin2(这里用窗体句柄来代表窗体)。hWin1的窗体结构和回调函数为_aDialogCreate1,_cbCallback1, hWin2的窗体结构和回调函数为_aDialogCreate2,_cbCallback2。
2.响应上面窗体回调函数中的WM_PID_STATE_CHANGED消息。
通过跟踪代码得知,WM_PID_STATE_CHANGED为非控件区捕获触摸屏消息。而其他两个相关消息WM_TOUCH_CHILD,WM_TOUCH则为控件捕获触摸屏消息。即当我们按下非控件区时,会产生WM_PID_STATE_CHANGED消息。上面其他两个消息则为当我们在控件上操作触摸屏时产生的消息。
3.实现思路:
pMsg->Data.p是WM_PID_STATE_CHANGED消息中系统传递过来的一个参数,其为一个WM_PID_STATE_CHANGED_INFO类型的机构体指针。它包含当前触摸屏事件中的x,y轴坐标以及按下抬起的状态。在此,设置一个静态变量记下触摸屏按下时的x坐标,然后在在触摸屏抬起时比较抬起时触摸屏x坐标和上次按下时x坐标的差值,如果大于(右滑)或小于(左滑)某一预定义的值(即在触摸屏上滑过x轴坐标),即判断为右滑或左滑。
4.相关的代码模型如下:
#define TS_SLIDE_MIN_X 100 //滑动的最小X距离值
//===========================================================//第一个窗体hWin1的消息响应处理,注意这里假设hWin1为当前窗体(其已被创建并显示)。
//且为向右滑动推出第二个窗体hWin2
void _cbCallback1(WM_MESSAGE * pMsg){
......
static int ts_x;
//static int ts_y;
WM_PID_STATE_CHANGED_INFO *pTSState;
......
case WM_PID_STATE_CHANGED:
pTSState = (WM_PID_STATE_CHANGED_INFO*)(pMsg->Data.p);if (pTSState->State) //按下{
ts_x = pTSState->x;
}else if ((pTSState->x - ts_x) > TS_SLIDE_MIN_X){
WM_HideWindow(hWin1);if (hWin2 == NULL){
hWin2 = GUI_CreateDialogBox(_aDialogCreate2,GUI_COUNTOF(_aDialogCreate2),\
&_cbCallback2, 0, 0, 0);
}else{
WM_ShowWindow(hWin2);
}
}break;........
}
//===========================================================
//第二个窗体hWin2的消息响应处理,注意这里假设hWin2为滑动产生的窗体。
//向左滑动推出第二个窗体hWin2
{
......
static int ts_x;
//static int ts_y;
WM_PID_STATE_CHANGED_INFO *pTSState;
......
case WM_PID_STATE_CHANGED: //如果点中其他非按钮类
pTSState = (WM_PID_STATE_CHANGED_INFO*)(pMsg->Data.p);
if (pTSState->State) //按下{ts_x = pTSState->x;}else if ((ts_x - pTSState->x) >TS_SLIDE_MIN_X){WM_HideWindow(hWin2);WM_ShowWindow(hWin1);}break;
.......
}
类此,也可实现上下滑屏。