📄 menu.c
字号:
#include "twoflag.h"
#include "common.h"
#include "net.h"
//////////////////////////////////////////////////////////////////////////
//开始显示动态图像
//nResID: 位图在资源号 cxF: 帧宽 nF: 帧数 nR: 速率
//////////////////////////////////////////////////////////////////////////
boolean dispAnim(CJunQi* pApp,int16 nResID,int cxF,int nF,int nR,int x,int y)
{
AEEImageInfo ii;
if((pApp->pIImage=ISHELL_LoadResImage(pApp->a.m_pIShell,TWOFLAG_RES_FILE,nResID))==NULL)
{
return FALSE;
}
IIMAGE_GetInfo(pApp->pIImage,&ii);
IIMAGE_SetParm(pApp->pIImage,IPARM_CXFRAME,cxF,0);
IIMAGE_SetParm(pApp->pIImage,IPARM_NFRAMES,nF,0);
IIMAGE_SetParm(pApp->pIImage,IPARM_RATE,nR,0);
IIMAGE_Start(pApp->pIImage,(pApp->cxScreen-ii.cx/nF)/2,(pApp->cyScreen-ii.cy)/2);
return TRUE;
}
//////////////////////////////////////////////////////////////////////////
//停止显示动态图像
//////////////////////////////////////////////////////////////////////////
static void StopAnim(CJunQi* pApp)
{
IIMAGE_Stop(pApp->pIImage);
IIMAGE_Release(pApp->pIImage);
InitLoginMenu(pApp); //调用初始化联网游戏菜单
}
//////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////
void DisplayOutput(CJunQi* pApp, int nline, char *pszStr)
{
AECHAR * pszBuf = NULL;
AECHAR * psz = NULL;
int pixelWidth;
AEEFont font = AEE_FONT_NORMAL;
int pnFits = 0, dy;
int totalCh = 0;
int charHeight = 0; // Stores the char height in pixels for given font
int pnAscent = 0; // Stores the ascent in number of pixels
int pnDescent = 0; // Stores the descent in number of pixels
AEERect rc;
if (pApp == NULL)
return;
if ((pszBuf = (AECHAR *)MALLOC(MAXLEN)) == NULL)
return;
// Get the font metrics info
charHeight = IDISPLAY_GetFontMetrics (pApp->a.m_pIDisplay, AEE_FONT_NORMAL,
&pnAscent, &pnDescent);
// Convert to wide string (unicode)
STR_TO_WSTR ((char *)pszStr, pszBuf, MAXLEN);
if (nline < 0) {
dy = pApp->cyScreen*2/5;
}
else{
dy = nline * charHeight;
}
psz = pszBuf;
totalCh = STRLEN ((char *)pszStr);
while ((totalCh > 0) && (*psz != NULL))
{
pixelWidth = IDISPLAY_MeasureTextEx(pApp->a.m_pIDisplay,
font,
(AECHAR *) psz,
-1,
pApp->cxScreen - 5,
&pnFits);
if (pnFits == 0)
{
FREE (pszBuf);
return;
}
SETAEERECT(&rc, 0, dy, pApp->cyScreen, charHeight);
IDISPLAY_EraseRect(pApp->a.m_pIDisplay, &rc);
IDISPLAY_DrawText(pApp->a.m_pIDisplay, AEE_FONT_NORMAL, psz, pnFits, 5 ,
dy, 0 , IDF_TEXT_TRANSPARENT);
psz += pnFits; // move pointer to the next segment to be displayed
totalCh -= pnFits; // reduce the total number of characters to still display
dy += charHeight; // Place next line charHeight pixels below the
// previous line.
IDISPLAY_Update(pApp->a.m_pIDisplay);
if (totalCh < pnFits)
pnFits = totalCh; // if total number is less than pnFits, adjust pnFits
}
FREE (pszBuf);
return;
}
//////////////////////////////////////////////////////////////////////////
//清除菜单项记数
//////////////////////////////////////////////////////////////////////////
void ClrMenuRowCount(CJunQi* pApp)
{
pApp->nMenuRow = 0;
pApp->nMenuCol = 0;
pApp->nTableCount = 1;
}
//////////////////////////////////////////////////////////////////////////
//启动APP_STATE_START时显示的图像
//////////////////////////////////////////////////////////////////////////
void DisplaySplashScreen( CJunQi* pApp)
{
IImage* pSplash;
AEEImageInfo rImageInfo;
IDISPLAY_ClearScreen( pApp->a.m_pIDisplay );
pSplash = ISHELL_LoadResImage( pApp->a.m_pIShell, TWOFLAG_RES_FILE, IDB_SPLASH );
if( pSplash )
{
// 获取图像信息
IIMAGE_GetInfo( pSplash, &rImageInfo );
// 在屏幕中心显示图像
IIMAGE_Draw( pSplash, ( pApp->cxScreen - rImageInfo.cx ) / 2 , ( pApp->cyScreen - rImageInfo.cy ) / 2 );
// 释放图像
IIMAGE_Release( pSplash );
// 设置回调函数
ISHELL_SetTimer( pApp->a.m_pIShell, SPLASH_TIMER_DURATION, ( PFNNOTIFY ) InitMainMenu, pApp );
}
else
{
InitMainMenu( pApp ); //显示主菜单屏幕
}
IDISPLAY_Update( pApp->a.m_pIDisplay );
}
//////////////////////////////////////////////////////////////////////////
//显示光标:
//x,y:光标的x,y坐标; width:光标移动一列的高度 height: 光标移动一行的高度;
//nResID:光标的资源ID号; row:光标所在行号 col:光标所在列号
//////////////////////////////////////////////////////////////////////////
void DrawCursor(CJunQi* pApp, int x, int y, int16 width, int16 height, int16 nResID, int16 row, int16 col)
{
IImage * pImage = NULL;
if((pImage = ISHELL_LoadResImage(pApp->a.m_pIShell, TWOFLAG_RES_FILE, nResID)) == NULL)
return;
// 设置图片参数,透明 Make the image transparent
IIMAGE_SetParm( pImage, IPARM_ROP, AEE_RO_TRANSPARENT, 0 );
IIMAGE_Draw(pImage, x+width*col, y+height*row);
IDISPLAY_Update(pApp->a.m_pIDisplay);
IIMAGE_Release(pImage);
}
//////////////////////////////////////////////////////////////////////////
//所有的按键事件
//////////////////////////////////////////////////////////////////////////
boolean onKeyEvent(CJunQi *pApp,AEEEvent eCode, uint16 wParam,uint32 dwParam)
{
switch(pApp->m_eAppState)
{
case APP_STATE_MAIN_MENU:
return MainMenuEvent(pApp,eCode,wParam,dwParam);
case APP_STATE_NETWARE_MODE:
return MenuNetwareEvent(pApp,eCode,wParam,dwParam);
case APP_STATE_OPTION:
case APP_STATE_HELP:
case APP_STATE_ABOUT:
break;
case APP_STATE_LOGIN:
return MenuLoginEvent(pApp,eCode,wParam,dwParam);
case APP_STATE_SELECTHEAD:
return MenuSelectHeadEvent(pApp,eCode,wParam,dwParam);
case APP_STATE_INPUTNAME:
return InputNameEvent(pApp,eCode,wParam,dwParam);
case APP_STATE_LAB:
return MenuLabEvent(pApp,eCode,wParam,dwParam);
case APP_STATE_TABLE:
return MenuTableEvent(pApp,eCode,wParam,dwParam);
case APP_STATE_LAYOUT:
return LayoutEvent(pApp,eCode,wParam,dwParam);
case APP_STATE_MOVECHESS:
break;
default:
break;
}
return TRUE;
}
/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
//////////////////////////////////////////////////////////////////////////
//初始化主菜单
//////////////////////////////////////////////////////////////////////////
static void InitMainMenu(CJunQi* pApp)
{
char *number = "login:";
ClrMenuRowCount(pApp);
DisplayMainMenu(pApp);
DrawCursor(pApp,OFFSET_X_CURSOR,OFFSET_Y_CURSOR,0,OFFSET_HEIGHT,IDB_MAINMENUCURSOR,pApp->nMenuRow,0);
pApp->m_eAppState = APP_STATE_MAIN_MENU;
MEMSET(pApp->m_PacketChar,'\0',sizeof(pApp->m_MobileNumber));
SPRINTF(pApp->m_PacketChar,"%s",number);
}
//////////////////////////////////////////////////////////////////////////
//显示主菜单屏幕
//////////////////////////////////////////////////////////////////////////
void DisplayMainMenu(CJunQi* pApp)
{
//Add code to here...
IImage *pMenu;
AEEImageInfo rImageInfo;
IDISPLAY_ClearScreen( pApp->a.m_pIDisplay );
pMenu = ISHELL_LoadResImage( pApp->a.m_pIShell, TWOFLAG_RES_FILE, IDB_MAINMENU );
if( pMenu )
{
// 获取图像信息
IIMAGE_GetInfo( pMenu, &rImageInfo );
// 在屏幕中心显示图像
IIMAGE_Draw( pMenu, ( pApp->cxScreen - rImageInfo.cx ) / 2 , ( pApp->cyScreen - rImageInfo.cy ) / 2 );
IDISPLAY_Update( pApp->a.m_pIDisplay );
IIMAGE_Release( pMenu );
}
}
//////////////////////////////////////////////////////////////////////////
//主菜单事件
//////////////////////////////////////////////////////////////////////////
boolean MainMenuEvent(CJunQi *pApp,AEEEvent eCode, uint16 wParam,uint32 dwParam)
{
switch(wParam)
{
case AVK_UP:
pApp->nMenuRow--;
if(pApp->nMenuRow < 0)
pApp->nMenuRow = 4;
DisplayMainMenu(pApp);
DrawCursor(pApp, OFFSET_X_CURSOR, OFFSET_Y_CURSOR, 0, OFFSET_HEIGHT, IDB_MAINMENUCURSOR, pApp->nMenuRow, 0);
break;
case AVK_DOWN:
pApp->nMenuRow++;
if(pApp->nMenuRow >= 5)
pApp->nMenuRow = 0;
DisplayMainMenu(pApp);
DrawCursor(pApp, OFFSET_X_CURSOR, OFFSET_Y_CURSOR, 0, OFFSET_HEIGHT, IDB_MAINMENUCURSOR, pApp->nMenuRow, 0);
break;
case AVK_CLR:
ISHELL_CloseApplet(pApp->a.m_pIShell,TRUE); //关闭程序
break;
case AVK_SELECT:
switch(pApp->nMenuRow)
{
case 0:
{
//add code to here ......
//进入大厅
if(dispAnim(pApp,IDB_CONNECT,120,4,200,(pApp->cxScreen-100)/2,(pApp->cyScreen-36)/2))
ISHELL_SetTimer( pApp->a.m_pIShell, SPLASH_TIMER_DURATION * 3, ( PFNNOTIFY ) StopAnim, pApp );
if(ISHELL_CreateInstance(pApp->a.m_pIShell, AEECLSID_NET, (void **)&pApp->pINetMgr)!=SUCCESS)
return FALSE;
if(GetMobileNumber(pApp))
{
OpenConnection(pApp);
}
else
return FALSE;
}
break;
case 1:
//add code to here ......
// pApp->m_eAppState = APP_STATE_OPTION; //改变状态至选项状态
break;
case 2:
//add code to here ......
// pApp->m_eAppState = APP_STATE_HELP; //改变状态至帮助状态
break;
case 3:
//add code to here ......
// pApp->m_eAppState = APP_STATE_ABOUT; //改变状态至关于状态
break;
case 4:
//add code to here ......
ISHELL_CloseApplet(pApp->a.m_pIShell,TRUE); //关闭程序
break;
default:
break;
}
default:
break;
}
return TRUE;
}
//////////////////////////////////////////////////////////////////////////
//获取手机号码
//////////////////////////////////////////////////////////////////////////
boolean GetMobileNumber(CJunQi* pApp)
{
int n;
TAPIStatus tapiStat;
if(ISHELL_CreateInstance(pApp->a.m_pIShell,AEECLSID_TAPI,(void **)&pApp->pITapi)!=SUCCESS)
return FALSE;
if (ITAPI_GetStatus(pApp->pITapi, &tapiStat) == EBADPARM)
{
DisplayOutput(pApp, 1, "TAPI Status fetch failed");
return FALSE;
}
SPRINTF(pApp->m_MobileNumber,"%s",tapiStat.szMobileID);
n = STRLEN(pApp->m_PacketChar);
STRCAT(pApp->m_PacketChar,pApp->m_MobileNumber);
STRCAT(pApp->m_PacketChar,"#");
DisplayOutput(pApp, 1, "Mobile ID: ");
DisplayOutput(pApp, 2, pApp->m_MobileNumber);
ITAPI_Release(pApp->pITapi);
pApp->pITapi=NULL;
return TRUE;
}
/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
//////////////////////////////////////////////////////////////////////////
//初始化登录菜单
//////////////////////////////////////////////////////////////////////////
void InitLoginMenu(CJunQi* pApp)
{
ClrMenuRowCount(pApp);
DisplayLoginMenu(pApp);
DrawCursor(pApp,OFFSET_X_LOGIN, OFFSET_Y_LOGIN, 0, OFFSET_HEIGHT_LOGIN,IDB_MAINMENUCURSOR,pApp->nMenuRow,0);
pApp->m_eAppState = APP_STATE_LOGIN;
}
//////////////////////////////////////////////////////////////////////////
//显示登录屏幕
//////////////////////////////////////////////////////////////////////////
void DisplayLoginMenu(CJunQi* pApp)
{
//Add code to here...
IImage *pMenu;
AEEImageInfo rImageInfo;
IDISPLAY_ClearScreen( pApp->a.m_pIDisplay );
pMenu = ISHELL_LoadResImage( pApp->a.m_pIShell, TWOFLAG_RES_FILE, IDB_LOGIN );
if( pMenu )
{
// 获取图像信息
IIMAGE_GetInfo( pMenu, &rImageInfo );
// 在屏幕中心显示图像
IIMAGE_Draw( pMenu, ( pApp->cxScreen - rImageInfo.cx ) / 2 , ( pApp->cyScreen - rImageInfo.cy ) / 2 );
IDISPLAY_Update( pApp->a.m_pIDisplay );
IIMAGE_Release( pMenu );
}
}
//////////////////////////////////////////////////////////////////////////
//登录菜单事件
//////////////////////////////////////////////////////////////////////////
boolean MenuLoginEvent(CJunQi *pApp,AEEEvent eCode, uint16 wParam,uint32 dwParam)
{
switch(wParam)
{
case AVK_UP:
pApp->nMenuRow--;
if(pApp->nMenuRow < 0)
pApp->nMenuRow = 1;
DisplayLoginMenu(pApp);
DrawCursor(pApp, OFFSET_X_LOGIN, OFFSET_Y_LOGIN, 0, OFFSET_HEIGHT_LOGIN, IDB_MAINMENUCURSOR, pApp->nMenuRow, 0);
break;
case AVK_DOWN:
pApp->nMenuRow++;
if(pApp->nMenuRow > 1)
pApp->nMenuRow = 0;
DisplayLoginMenu(pApp);
DrawCursor(pApp, OFFSET_X_LOGIN, OFFSET_Y_LOGIN, 0, OFFSET_HEIGHT_LOGIN, IDB_MAINMENUCURSOR, pApp->nMenuRow, 0);
break;
case AVK_CLR:
InitMainMenu(pApp); //关闭程序
break;
case AVK_SELECT:
switch(pApp->nMenuRow)
{
case 0: //发送新登录信息
//add code to here ......
{
InitInputName(pApp);
}
break;
case 1:
//add code to here ......
// pApp->m_eAppState = APP_STATE_OPTION; //改变状态至选项状态
break;
default:
break;
}
default:
break;
}
return TRUE;
}
/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
//////////////////////////////////////////////////////////////////////////
//初始化输入用户名界面
//////////////////////////////////////////////////////////////////////////
void InitInputName(CJunQi* pApp)
{
AEERect rect;
AECHAR ch[] = {'t','i','a','n','\0'};
ClrMenuRowCount(pApp);
DisplayInputNameUI(pApp);
pApp->m_eAppState = APP_STATE_INPUTNAME;
if (ISHELL_CreateInstance(pApp->a.m_pIShell,AEECLSID_TEXTCTL,(void**)&pApp->pText) != SUCCESS)
return ;
rect.dx = 80;
rect.dy = 30;
rect.x = (pApp->cxScreen - rect.dx)/2 ;
rect.y = 20;
//设置属性,有边框
ITEXTCTL_SetProperties(pApp->pText,TP_FRAME);
//设置显示矩形区域
ITEXTCTL_SetRect(pApp->pText, &rect);
//设定初始字符helloworld
ITEXTCTL_SetText(pApp->pText, ch, 20);
ITEXTCTL_SetMaxSize(pApp->pText,8);
//设定输入模式
ITEXTCTL_SetInputMode(pApp->pText,AEE_TM_LETTERS);
ITEXTCTL_SetActive(pApp->pText,TRUE);
}
//////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////
void FinishInputName(CJunQi* pApp)
{
if (pApp->pText)
{
ITEXTCTL_Release(pApp->pText);
pApp->pText = NULL;
}
return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -