这个是我之前WM_MOTION消息做的处理
[C] 纯文本查看 复制代码 /*
*********************************************************************************************************
* 函 数 名: _cbMotion
* 功能说明: Motion窗口的回调函数,主要是桌面图标的滑动处理
* 形 参: pMsg WM_MESSAGE类型指针变量
* 返 回 值: 无
*********************************************************************************************************
*/
static void _cbMotion(WM_MESSAGE * pMsg)
{
WM_MOTION_INFO * pInfo;
WM_HWIN hWin = pMsg->hWin;
PARA * pPara;
static uint32_t tStart, tEnd;
int NCode, Id;
switch (pMsg->MsgId)
{
case WM_PRE_PAINT:
GUI_MULTIBUF_Begin();
break;
case WM_POST_PAINT:
GUI_MULTIBUF_End();
break;
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
switch (Id)
{
/* 第一个界面上的图标 */
case GUI_ID_ICONVIEW0:
switch (NCode)
{
/* ICON控件点击消息 */
case WM_NOTIFICATION_CLICKED:
tStart = GUI_GetTime();
break;
/* ICON控件释放消息 */
case WM_NOTIFICATION_RELEASED:
tEnd = GUI_GetTime() - tStart;
if(tEnd > 800)
{
WM_SetFocus(WM_HBKWIN);
break;
}
_apModules0[ICONVIEW_GetSel(pMsg->hWinSrc)](WM_HBKWIN);
break;
}
break;
/* 第二个界面上的图标 */
case GUI_ID_ICONVIEW1:
switch (NCode)
{
/* ICON控件点击消息 */
case WM_NOTIFICATION_CLICKED:
tStart = GUI_GetTime();
break;
/* ICON控件释放消息 */
case WM_NOTIFICATION_RELEASED:
tEnd = GUI_GetTime() - tStart;
if(tEnd > 800)
{
WM_SetFocus(WM_HBKWIN);
break;
}
_apModules1[ICONVIEW_GetSel(pMsg->hWinSrc)](WM_HBKWIN);
break;
}
break;
/* 第三个界面上的图标,仅用于演示目的 */
case GUI_ID_ICONVIEW2:
switch (NCode)
{
/* ICON控件点击消息 */
case WM_NOTIFICATION_CLICKED:
tStart = GUI_GetTime();
break;
/* ICON控件释放消息 */
case WM_NOTIFICATION_RELEASED:
tEnd = GUI_GetTime() - tStart;
if(tEnd > 800)
{
WM_SetFocus(WM_HBKWIN);
break;
}
_apModules2[ICONVIEW_GetSel(pMsg->hWinSrc)](WM_HBKWIN);
break;
}
break;
}
break;
case WM_MOTION:
WM_GetUserData(hWin, &pPara, sizeof(pPara));
pInfo = (WM_MOTION_INFO *)pMsg->Data.p;
switch (pInfo->Cmd)
{
#if 1 /* F429板子采用的实现方式 ********************************
WM_MOTION_SetDefaultPeriod(20);周期设置小点,快速返回
*/
case WM_MOTION_INIT:
pInfo->Flags = WM_CF_MOTION_X | WM_MOTION_MANAGE_BY_WINDOW;
pInfo->SnapX = 1;
break;
case WM_MOTION_MOVE:
pPara->FinalMove = pInfo->FinalMove;
pPara->Pos += pInfo->dx;
printf_main("pData->xPos = %d %d\r\n", pPara->Pos, pInfo->dx);
/* 滑动有加速度,停止后,减速度*/
if(pPara->FinalMove)
{
printf_main("pData->FinalMove = %d\r\n", pPara->Pos);
/* 桌面图标移动到此范围内就将其固定在第3个图标显示 */
if(pPara->Pos <= -(LCD_GetXSize() + LCD_GetXSize()/2))
{
s_ucIconSwitch = 2;
pPara->Pos = -(2 * LCD_GetXSize());
}
/* 桌面图标移动到此范围内就将其固定在第2个图标显示 */
else if((pPara->Pos > -(LCD_GetXSize() + LCD_GetXSize()/2))&&(pPara->Pos <= -LCD_GetXSize()/2))
{
s_ucIconSwitch = 1;
pPara->Pos = -(LCD_GetXSize());
}
/* 桌面图标移动到此范围内就将其固定在第1个图标显示 */
else if(pPara->Pos > -LCD_GetXSize()/2)
{
s_ucIconSwitch = 0;
pPara->Pos = 0;
}
}
/* WM_MOTION_SetDefaultPeriod设置的周期30ms及其以下时dx跳动较大
建议取值35-50即可。
*/
if((pInfo->dx < -4) || (pInfo->dx > 4) || (pPara->FinalMove))
/* 移动桌面图标 */
WM_MoveTo(hWin, pPara->Pos, 0);
#else /* emWin默认的Motion使用方案 ********************************
WM_MOTION_SetDefaultPeriod(100);设置的时间长点可以看出效果
*/
case WM_MOTION_INIT:
pInfo->Flags = WM_CF_MOTION_X | WM_MOTION_MANAGE_BY_WINDOW;
pInfo->SnapX = 800; /* 设置栅格大小 */
break;
case WM_MOTION_MOVE:
pPara->FinalMove = pInfo->FinalMove;
pPara->Pos += pInfo->dx;
printf_main("pData->xPos = %d %d\r\n", pPara->Pos, pInfo->dx);
/* 设置滑动到最左侧时的处理办法,超过一半就不可以再滑动了,否则会滑动进行下一个栅格*/
if(pPara->Pos >= LCD_GetXSize()/2)
pPara->Pos = LCD_GetXSize()/2 - 1;
/* 设置滑动到最右侧时的处理办法,超过一半就不可以再滑动了,否则会滑动进行下一个栅格*/
if(pPara->Pos <= -(LCD_GetXSize()*2 + LCD_GetXSize()/2))
pPara->Pos = -(LCD_GetXSize()*2 + LCD_GetXSize()/2 - 1);
/* 滑动松手后,会按照WM_MOTION_SetDefaultPeriod设置的时间减速并停止到最近的栅格 */
if(pPara->FinalMove)
{
printf_main("pData->FinalMove = %d\r\n", pPara->Pos);
/* 桌面图标移动到此范围内就将其固定在第3个图标显示 */
if(pPara->Pos <= -(LCD_GetXSize() + LCD_GetXSize()/2))
{
s_ucIconSwitch = 2;
}
/* 桌面图标移动到此范围内就将其固定在第2个图标显示 */
else if((pPara->Pos > -(LCD_GetXSize() + LCD_GetXSize()/2))&&(pPara->Pos <= -LCD_GetXSize()/2))
{
s_ucIconSwitch = 1;
}
/* 桌面图标移动到此范围内就将其固定在第1个图标显示 */
else if(pPara->Pos > -LCD_GetXSize()/2)
{
s_ucIconSwitch = 0;
}
}
/* 移动桌面图标 */
WM_MoveTo(hWin, pPara->Pos, 0);
/* 下面这个三个未使用,当设置滑动窗口的大小是800*480时,可以仅拖动ICONVIEW控件即可
当前是采用800*3宽度的界面大小,是拖动的ICONVIEW控件的父窗口。
*/
//WM_MoveTo(hIcon1, pPara->Pos + ICONVIEW_LBorder , ICONVIEW_TBorder);
//WM_MoveTo(hIcon2, pPara->Pos + 800 + ICONVIEW_LBorder, ICONVIEW_TBorder);
//WM_MoveTo(hIcon3, pPara->Pos + 1600 + ICONVIEW_LBorder, ICONVIEW_TBorder);
#endif
break;
case WM_MOTION_GETPOS:
pInfo->xPos = pPara->Pos;
break;
}
break;
}
} |