menu.c
来自「基于h323协议的软phone」· C语言 代码 · 共 301 行
C
301 行
/***************************************************************************
*
* Module: menu.c
*
* Description:
*
* Author: chenjian
*
* Copyright 1999, BEP Technologies, Inc., All rights reserved
*
*
* Change Log:
*
* Date By Description
* ========== =========== ==========================================
* 10/20/2003 chenjian Created
*
***************************************************************************/
#include "menu.h"
#include "pgi_api.h"
#include "pgi_lcd.h"
#include <stdlib.h>
void initPoint(s_point* p)
{
p->up = NULL;
p->down = NULL;
p->father = NULL;
p->son = NULL;
p->menu = NULL;
}
void clearMenuMen(s_menu* pMenu)
{
if (pMenu->pRoot != NULL)
{
clearPointMem(pMenu->pRoot);
pMenu->pRoot = NULL;
}
pMenu->pCur = NULL;
}
void clearPointMem(s_point* p)
{
if (p != NULL)
{
clearPointMem(p->down);
clearPointMem(p->son);
if (p->menu != NULL)
{
free(p->menu);
}
free(p);
}
}
void resetMenu(s_menu* pMenu)
{
pMenu->pCur = pMenu->pRoot;
pMenu->iDis = 0;
pMenu->iShow= FALSE;
}
void checkDis(s_menu* pMenu)
{
if (pMenu->iDis < 0)
{
pMenu->iDis = 0;
}
else if (pMenu->iDis >= LCD_ROW_NUM)
{
pMenu->iDis = LCD_ROW_NUM - 1;
}
}
void showMenu(s_menu* pMenu)
{
int i = LCD_ROW_NUM - 1, j = 0;
s_point* psPoint = pMenu->pCur;
checkDis(pMenu);
while (i > pMenu->iDis && psPoint->down != NULL)
{
psPoint = psPoint->down;
i--;
}
pMenu->iDis = i;
psPoint = pMenu->pCur;
for (i = 0; i < pMenu->iDis; i++)
{
if (psPoint->up != NULL)
{
psPoint= psPoint->up;
}
else
{
pMenu->iDis = i;
break;
}
}
ClearLcd();
for (i = 0; i < pMenu->iDis; i++)
{
/*printf(" %s\n", psPoint->menu->strName);*/
WriteLcd(" ", j, 0);
WriteLcd(psPoint->menu->strName, j++, 1);
psPoint = psPoint->down;
}
/*printf("*%s\n", psPoint->menu->strName);*/
#ifdef GXM16032
WriteLcd("\x1a", j, 0);
#else
WriteLcd("\x7E", j, 0);
#endif
WriteLcd(psPoint->menu->strName, j++, 1);
for (i = 0; i < LCD_ROW_NUM - pMenu->iDis - 1; i++)
{
if (psPoint->down == NULL)
{
break;
}
psPoint = psPoint->down;
/*printf(" %s\n", psPoint->menu->strName);*/
WriteLcd(" ", j, 0);
WriteLcd(psPoint->menu->strName, j++, 1);
}
}
int menuControl(s_event* psEvent, s_task* psTask)
{
int iEvent = null_event, i;
s_menu* psMenu = (s_menu*)psTask->pData;
if (!psMenu->iShow)
{
if (psEvent->iEvent == ok_key_event)
{
psMenu->iShow = TRUE;
showMenu(psMenu);
}
return iEvent;
}
switch (psEvent->iEvent)
{
case ok_key_event:
{
if (psMenu->pCur->son != NULL)
{
psMenu->pCur = psMenu->pCur->son;
psMenu->iDis = 0;
showMenu(psMenu);
}
else
{
iEvent = psMenu->pCur->menu->funcAction(psTask);
}
break;
}
case cancel_key_event:
{
if (psMenu->pCur->father == NULL || psMenu->pCur->father->son == psMenu->pRoot)
{
iEvent = reset_event;
}
else
{
psMenu->pCur = psMenu->pCur->father;
psMenu->iDis = 0;
showMenu(psMenu);
}
break;
}
case left_key_event:
{
if (psMenu->pCur->up != NULL)
{
psMenu->pCur = psMenu->pCur->up;
if (psMenu->iDis > 0)
{
psMenu->iDis--;
}
}
else
{
i = 0;
while (psMenu->pCur->down != NULL)
{
i++;
psMenu->pCur = psMenu->pCur->down;
}
psMenu->iDis = (i < LCD_ROW_NUM) ? i : LCD_ROW_NUM - 1;
}
showMenu(psMenu);
break;
}
case right_key_event:
{
if (psMenu->pCur->down != NULL)
{
psMenu->pCur = psMenu->pCur->down;
if (psMenu->iDis < LCD_ROW_NUM - 1)
{
psMenu->iDis++;
}
}
else
{
i = 0;
while (psMenu->pCur->up != NULL)
{
i++;
psMenu->pCur = psMenu->pCur->up;
}
psMenu->iDis = 0;
}
showMenu(psMenu);
break;
}
}
return iEvent;
}
int resetMenuAct(s_task* psTask)
{
resetMenu((s_menu*)psTask->pData);
return null_event;
}
int clearMenuAct(s_task* psTask)
{
if (psTask != NULL)
{
s_menu* psMenu = (s_menu*)psTask->pData;
clearMenuMen(psMenu);
free(psMenu);
if (psTask->psTask != NULL)
{
psTask->psTask->fClear(psTask->psTask);
}
free(psTask);
}
return null_event;
}
int menuAction(s_event* psEvent, s_task* psTask)
{
int iEvent = null_event;
s_event sEvent;
if (psEvent->iEvent == reset_event)
{
resetTask(psTask);
return return_event;
}
else if (psEvent->iEvent == return_event)
{
clearSonTask(psTask);
showMenu((s_menu*)psTask->pData);
return null_event;
}
if (psTask->psTask != NULL)
{
iEvent = psTask->psTask->fAction(psEvent, psTask->psTask);
}
else
{
iEvent = menuControl(psEvent, psTask);
}
/*
if (iEvent != null_event)
{
sEvent.iEvent = iEvent;
iEvent = menuAction(&sEvent, psTask);
}
*/
return iEvent;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?