• 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]);
    				}
    			}
    		}		
    	}
    }
  • 相关阅读:
    poj3016
    BZOJ2560 串珠子
    HAOI 2009 逆序对数列
    BJOI2012 最多的方案
    ZJOI2008 生日聚会
    ZJOI2008 骑士
    SCOI2003 严格N元树
    SDOI2010 地精部落
    USACO Section 3.2 Stringsobits
    JLOI2013 卡牌游戏
  • 原文地址:https://www.cnblogs.com/huangdengtao/p/12427347.html
Copyright © 2020-2023  润新知