码迷,mamicode.com
首页 > 其他好文 > 详细

8.4.3 mainpage输入功能

时间:2020-03-06 17:08:31      阅读:57      评论:0      收藏:0      [点我收藏+]

标签:manual   ase   触摸   input   pop   区域   release   解析   default   

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]为'\0'时, 使用设置页面里选定的目录来显示 */
                            tPageParams.strCurPictureFile[0] = '\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]);
                }
            }
        }       
    }
}

8.4.3 mainpage输入功能

标签:manual   ase   触摸   input   pop   区域   release   解析   default   

原文地址:https://www.cnblogs.com/huangdengtao/p/12427347.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!