8.4.3 mainpage输入功能

1.代码解析

GenericGetInputEvent

/**********************************************************************
 * 函数名称: GenericGetInputEvent
 * 功能描述: 读取输入数据,并判断它位于哪一个图标上
 * 输入参数: ptPageLayout - 内含多个图标的显示区域
 * 输出参数: ptInputEvent - 内含得到的输入数据
 * 返 回 值: -1     - 输入数据不位于任何一个图标之上
 *            其他值 - 输入数据所落在的图标(PageLayout->atLayout数组的哪一项)
 * 修改日期        版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2013/02/08	     V1.0	  韦东山	      创建
 ***********************************************************************/
int GenericGetInputEvent(PT_PageLayout ptPageLayout, PT_InputEvent ptInputEvent)
{
	T_InputEvent tInputEvent;
	int iRet;
	int i = 0;
	PT_Layout atLayout = ptPageLayout->atLayout;
	
	/* 获得原始的触摸屏数据 
	* 它是调用input_manager.c的函数,此函数会让当前线否休眠
	* 当触摸屏线程获得数据后,会把它唤醒
	*/
	iRet = GetInputEvent(&tInputEvent);
	if (iRet)
	{
		return -1;
	}

	if (tInputEvent.iType != INPUT_TYPE_TOUCHSCREEN)
	{
		return -1;
	}

	*ptInputEvent = tInputEvent;
	
	/* 处理数据 */
	/* 确定触点位于哪一个按钮上 */
	while (atLayout[i].strIconName)
	{
		if ((tInputEvent.iX >= atLayout[i].iTopLeftX) && (tInputEvent.iX <= atLayout[i].iBotRightX) && 
			(tInputEvent.iY >= atLayout[i].iTopLeftY) && (tInputEvent.iY <= atLayout[i].iBotRightY))
		{
			/* 找到了被点中的按钮 */
			return i;
		}
		else
		{
			i++;
		}			
	}

	/* 触点没有落在按钮上 */
	return -1;
}

MainPageGetInputEvent

/**********************************************************************
 * 函数名称: MainPageGetInputEvent
 * 功能描述: 为"主页面"获得输入数据,判断输入事件位于哪一个图标上
 * 输入参数: ptPageLayout - 内含多个图标的显示区域
 * 输出参数: ptInputEvent - 内含得到的输入数据
 * 返 回 值: -1     - 输入数据不位于任何一个图标之上
 *            其他值 - 输入数据所落在的图标(PageLayout->atLayout数组的哪一项)
 * 修改日期        版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2013/02/08	     V1.0	  韦东山	      创建
 ***********************************************************************/
static int MainPageGetInputEvent(PT_PageLayout ptPageLayout, PT_InputEvent ptInputEvent)
{
	return GenericGetInputEvent(ptPageLayout, ptInputEvent);
}

render.c

InvertButton

/**********************************************************************
 * 函数名称: InvertButton
 * 功能描述: 是把显示设备上指定区域里每个象素的颜色取反
 * 输入参数: ptLayout   - 矩形区域
 * 输出参数: 无
 * 返 回 值: 无
 * 修改日期        版本号     修改人          修改内容
 * -----------------------------------------------
 * 2013/02/08        V1.0     韦东山          创建
 ***********************************************************************/
static void InvertButton(PT_Layout ptLayout)
{
	int iY;
	int i;
	int iButtonWidthBytes;
	unsigned char *pucVideoMem;
	PT_DispOpr ptDispOpr = GetDefaultDispDev();

	pucVideoMem = ptDispOpr->pucDispMem;
	pucVideoMem += ptLayout->iTopLeftY * ptDispOpr->iLineWidth + ptLayout->iTopLeftX * ptDispOpr->iBpp / 8; /* 图标在Framebuffer中的地址 */
	iButtonWidthBytes = (ptLayout->iBotRightX - ptLayout->iTopLeftX + 1) * ptDispOpr->iBpp / 8;

	for (iY = ptLayout->iTopLeftY; iY <= ptLayout->iBotRightY; iY++)
	{
		for (i = 0; i < iButtonWidthBytes; i++)
		{
			pucVideoMem[i] = ~pucVideoMem[i];  /* 取反 */
		}
		pucVideoMem += ptDispOpr->iLineWidth;
	}
}

ReleaseButton

/**********************************************************************
 * 函数名称: ReleaseButton
 * 功能描述: 松开图标,只是改变显示设备上的图标按钮颜色
 * 输入参数: ptLayout   - 图标所在矩形区域
 * 输出参数: 无
 * 返 回 值: 无
 * 修改日期        版本号     修改人          修改内容
 * -----------------------------------------------
 * 2013/02/08        V1.0     韦东山          创建
 ***********************************************************************/
void ReleaseButton(PT_Layout ptLayout)
{
	InvertButton(ptLayout);
}

PressButton

/**********************************************************************
 * 函数名称: PressButton
 * 功能描述: 按下图标,只是改变显示设备上的图标按钮颜色
 * 输入参数: ptLayout   - 图标所在矩形区域
 * 输出参数: 无
 * 返 回 值: 无
 * 修改日期        版本号     修改人          修改内容
 * -----------------------------------------------
 * 2013/02/08        V1.0     韦东山          创建
 ***********************************************************************/
void PressButton(PT_Layout ptLayout)
{
	InvertButton(ptLayout);
}

mainpage.c

MainPageRun

/**********************************************************************
 * 函数名称: MainPageRun
 * 功能描述: "主页面"的运行函数: 显示菜单图标,根据用户输入作出反应
 * 输入参数: ptParentPageParams - 未用
 * 输出参数: 无
 * 返 回 值: 无
 * 修改日期        版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2013/02/08	     V1.0	  韦东山	      创建
 ***********************************************************************/
static void MainPageRun(PT_PageParams ptParentPageParams)
{
	int iIndex;
	T_InputEvent tInputEvent;
	int bPressed = 0;
	int iIndexPressed = -1;
	T_PageParams tPageParams;

	tPageParams.iPageID = ID("main");
	
	/* 1. 显示页面 */
	ShowMainPage(&g_tMainPageLayout);

	/* 2. 创建Prepare线程 */

	/* 3. 调用GetInputEvent获得输入事件,进而处理 */
	while (1)
	{
		iIndex = MainPageGetInputEvent(&g_tMainPageLayout, &tInputEvent);
		if (tInputEvent.iPressure == 0)
		{
			/* 如果是松开 */
			if (bPressed)
			{
				/* 曾经有按钮被按下 */
				ReleaseButton(&g_atMainPageIconsLayout[iIndexPressed]);
				bPressed = 0;

				if (iIndexPressed == iIndex) /* 按下和松开都是同一个按钮 */
				{
					switch (iIndexPressed)
					{
						case 0: /* 浏览按钮 */
						{
							/* tPageParams.strCurPictureFile[0]为''时, 使用设置页面里选定的目录来显示 */
							tPageParams.strCurPictureFile[0] = '';
							Page("manual")->Run(&tPageParams);

							/* 从设置页面返回后显示当首的主页面 */
							ShowMainPage(&g_tMainPageLayout);

							break;
						}
						case 1: /* 连播按钮 */
						{
							Page("auto")->Run(&tPageParams);

							/* 从设置页面返回后显示当首的主页面 */
							ShowMainPage(&g_tMainPageLayout);

							break;
						}
						case 2: /* 设置按钮 */
						{
							Page("setting")->Run(&tPageParams);

							/* 从设置页面返回后显示当首的主页面 */
							ShowMainPage(&g_tMainPageLayout);

							break;
						}
						default:
						{
							break;
						}
					}
				}
				
				iIndexPressed = -1;
			}
		}
		else
		{
			/* 按下状态 */
			if (iIndex != -1)
			{
				if (!bPressed)
				{
					/* 未曾按下按钮 */
					bPressed = 1;
					iIndexPressed = iIndex;
					PressButton(&g_atMainPageIconsLayout[iIndexPressed]);
				}
			}
		}		
	}
}
原文地址:https://www.cnblogs.com/huangdengtao/p/12427347.html