[C] 纯文本查看 复制代码
/*
[/quote]
你好,请教一下,我参考你2016年的工程,做了一个简单的窗口滑动,想去验证一下消息能否正常触发,但是实际测试工程中,WM_MOTION 和WM_MOTION_INIT都能触发,手指放上去就能触发。但是WM_MOTION_MOVE没有任何信息输出,看起来像是没有被触发,请教是我的函数写的哪里不对吗?还是说一直过程中有漏掉的地方[mw_shl_code=c,true]/*
*********************************************************************************************************
* 函 数 名: _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)
{
}
break;
case WM_MOTION:
WM_GetUserData(hWin, &pPara, sizeof(pPara));
pInfo = (WM_MOTION_INFO *)pMsg->Data.p;
DBG_PRINTF("WM MOTION Trigger\r\n");
switch (pInfo->Cmd)
{
#if 1 /* F429板子采用的实现方式 ********************************
WM_MOTION_SetDefaultPeriod(20);周期设置小点,快速返回
*/
case WM_MOTION_INIT:
DBG_PRINTF("WM MOTION Init \r\n");
pInfo->Flags = WM_CF_MOTION_X | WM_MOTION_MANAGE_BY_WINDOW;
pInfo->SnapX = 1;
break;
case WM_MOTION_MOVE:
DBG_PRINTF("WM MOTION Move \r\n");
pPara->FinalMove = pInfo->FinalMove;
pPara->Pos += pInfo->dx;
DBG_PRINTF("pData->xPos = %d %d\r\n", pPara->Pos, pInfo->dx);
// /* 滑动有加速度,停止后,减速度*/
// if(pPara->FinalMove)
// {
// DBG_PRINTF("pData->FinalMove = %d\r\n", pPara->Pos);
// /* 桌面图标移动到此范围内就将其固定在第3个图标显示 */
// if(pPara->Pos <= -(LCD_GetXSize() + LCD_GetXSize()/2))
// {
//
// pPara->Pos = -(2 * LCD_GetXSize());
// }
// /* 桌面图标移动到此范围内就将其固定在第2个图标显示 */
// else if((pPara->Pos > -(LCD_GetXSize() + LCD_GetXSize()/2))&&(pPara->Pos <= -LCD_GetXSize()/2))
// {
//
// pPara->Pos = -(LCD_GetXSize());
// }
// /* 桌面图标移动到此范围内就将其固定在第1个图标显示 */
// else if(pPara->Pos > -LCD_GetXSize()/2)
// {
// 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;
}
}
/**********************************************
*@name:MainTask
*@effect:main主函数调用的两个函数之一,ui绘制的主体,while循环
*@param:
* pMsg:消息
*@return:NULL
***********************************************/
void MainTask(void)
{
PARA Para;
PARA *pPara;
static WINDOW_DATA Data;
/* 数据初始化 */
pPara = &Para;
pPara->Pos = 0;
GUI_Init(); /* 初始化 */
GUI_SetOrientation(GUI_SWAP_XY| GUI_MIRROR_X);
WM_MULTIBUF_Enable(1);
WM_MOTION_Enable(1);//启用滑动支持
WM_MOTION_SetDefaultPeriod(50); //释放后,默认的减速值
bsp_Idle();
Data.xSize = LCD_GetXSize();
Data.ySize = LCD_GetYSize();
Data.TimeLastTouch = GUI_GetTime();
WM_SetSize(WM_HBKWIN, Data.xSize, Data.ySize);
DBG_PRINTF("LCD_X = %d ,LCD_Y = %d\r\n",Data.xSize,Data.ySize);
/* 第3步:绘制桌面窗口的背景图片 ------------------------------------------*/
hMotion = WM_CreateWindowAsChild(0,
0,
SCREEN_Width*3,
SCREEN_Height,
WM_HBKWIN,
WM_CF_MOTION_X | WM_CF_SHOW | WM_CF_HASTRANS,
_cbMotion,
sizeof(pPara));
WM_SetUserData(hMotion, &pPara, sizeof(pPara));
bsp_StartAutoTimer(0,100);//测试单位1ms,100ms扫一次
DBG_PRINTF("while(1) \r\n");
while(1)
{
GUI_Delay(10);
bsp_Idle();
// bsp_DelayMS(100);
//timer0:接收命令函数
if(bsp_CheckTimer(0))
{}
}
}