⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menu.c

📁 brew中个人开发的一个两国军棋游戏
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -