1.代码解析
/**********************************************************************
* 函数名称: 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
* 功能描述: 是把显示设备上指定区域里每个象素的颜色取反
* 输入参数: 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
* 功能描述: 松开图标,只是改变显示设备上的图标按钮颜色
* 输入参数: ptLayout - 图标所在矩形区域
* 输出参数: 无
* 返 回 值: 无
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2013/02/08 V1.0 韦东山 创建
***********************************************************************/
void ReleaseButton(PT_Layout ptLayout)
{
InvertButton(ptLayout);
}
/**********************************************************************
* 函数名称: 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]);
}
}
}
}
}