硬汉嵌入式论坛

 找回密码
 立即注册
查看: 198|回复: 1
收起左侧

[emWin] WM_MOTION 左滑,右滑信号

[复制链接]

3

主题

7

回帖

16

积分

新手上路

积分
16
发表于 2025-4-7 15:07:39 | 显示全部楼层 |阅读模式
请教,emwin中 WM_MOTION  能检测滑动动作,但是我翻看了《UM03001_emWin.pdf》的手册,没看到WM_MOTION_INFO中有参数能分辨他是左滑还是右滑?

请问有有对应的参数检测吗?或者有什么方法能在WM_MOTION信号后,分辨当前是左滑还是右滑?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-4-8 10:48:54 | 显示全部楼层
这个是我之前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;
  }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-25 22:11 , Processed in 4.093948 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表