Esempio n. 1
0
// 设置窗口定时器
int CBaseScreen::SetTimer(int nMs)
{
	int rtn = ISHELL_SetTimer(GETAPPBASIC()->pAeeApplet->m_pIShell, nMs, UTL_CB_Timer, this);
	if (SUCCESS == rtn)
	{
		m_bTimerOn = TRUE;
	}
	return rtn;
}
Esempio n. 2
0
/*===========================================================================
   This function draws the splash screen and brings up the main window
   after the splash timer runs out.
===========================================================================*/
void  TS_DrawSplash(CTopSoupApp * pme,AECHAR* prompt,int msTimeout,PFNNOTIFY on_splashOver,void* pUser)
{
	if( NULL == prompt )
		return;
	
	if (pme->m_pWin)
		CTopSoupApp_DisableWin(pme);
   
   {
      IImage * pi = ISHELL_LoadResImage(pme->a.m_pIShell, NAVIGATE_RES_FILE, IDP_OBJECT_PROMPT);
	  IStatic * pInfoStatic = NULL;

      if (pi)
      {
         AEERect  rect;
		 AEEImageInfo      info;
		 int16 x,y;

		 IIMAGE_GetInfo(pi,&info);
		 x = ( pme->m_rectWin.dx - info.cx ) / 2;
		 y = pme->m_rectWin.y + ( pme->m_rectWin.dy - info.cy ) / 2;
         SETAEERECT(&rect,x,y,info.cx,info.cy);
         TS_DrawImage(pi, &rect, TRUE);


		 ISHELL_CreateInstance(pme->a.m_pIShell, AEECLSID_STATIC, (void **)&pInfoStatic);
		 ISTATIC_SetRect(pInfoStatic, &rect);
		 ISTATIC_SetProperties(pInfoStatic,  ST_MIDDLETEXT | ST_CENTERTEXT | ST_NOSCROLL);
         TS_FitStaticText(pme->a.m_pIDisplay, pInfoStatic, AEE_FONT_LARGE, prompt);

         TS_RELEASEIF(pi);
		 TS_RELEASEIF(pInfoStatic);
      }

      // start the timer.
	  if ( on_splashOver )
		  ISHELL_SetTimer(pme->a.m_pIShell, msTimeout, (PFNNOTIFY)on_splashOver, pUser);  
	  else
		  ISHELL_SetTimer(pme->a.m_pIShell, msTimeout, (PFNNOTIFY)CTopSoupApp_onSplashDrawOver, pme);
   }
}
Esempio n. 3
0
//=============================================================================
//Repetedly executes our rendering loop
//@param	shell a pointer to the application ISHELL
//@param	data a pointer to data that will be passed to the callback
//=============================================================================
void GLApp::OnTimer(void *data)
{
	//call our render routine
	GLApp *pMe = (GLApp*)data;
	pMe->Render();

	if(pMe->m_KeyState == 1)
		pMe->KeyEvent(pMe->m_KeyParam);

	//repetedly call OnTimer again...
	ISHELL_SetTimer(pMe->m_pIShell, 50, (PFNNOTIFY)OnTimer, pMe);
}
Esempio n. 4
0
/*===========================================================================
===========================================================================*/
static boolean SamplePosDet_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
   CSamplePosDet *pMe = (CSamplePosDet *)pi;

   switch (eCode) {

   case EVT_APP_START:
      SamplePosDet_InitApplet( pMe );        
      /* Show the copyright and start the application after a delay seconds */
      ISHELL_ShowCopyright(pMe->theApp.m_pIShell);
      ISHELL_SetTimer(pMe->theApp.m_pIShell, 2000, (PFNNOTIFY) SamplePosDet_StartApplet, (uint32*) pMe);
      return TRUE;

   case EVT_APP_STOP:
      if( pMe->currentHandler ) {
         pMe->currentHandler( pMe, EVT_SCREEN, SCREEN_PARAM_CLOSE, 0 );
      }
      return TRUE;

   case EVT_APP_RESUME:
      SamplePosDet_DrawScreen( pMe, 0 );
      return TRUE;

   case EVT_APP_SUSPEND:
      return TRUE;

   case EVT_SCREEN :
      return SamplePosDet_ScreenHandler( pMe, eCode, wParam, dwParam );

   default:
      if( pMe->currentHandler ) {
         return pMe->currentHandler( pMe, eCode, wParam, dwParam );
      }
      break;
   }
   return FALSE;
}
Esempio n. 5
0
/*=============================================================================
FUNCTION: CDialerApp_CallingDlg_DisplayRefresh

DESCRIPTION: Refreshes the calling dialog display

PARAMETERS:
  *pMe: CDialerApp object pointer

RETURN VALUE:
  boolean: Returns TRUE if successful

COMMENTS:

SIDE EFFECTS:

SEE ALSO:

=============================================================================*/
boolean CDialerApp_CallingDlg_DisplayRefresh(void *pUser)
{
    CDialerApp *pMe = (CDialerApp*) pUser;
    IDialog *pActiveDlg;
    IStatic *pIStatic;
    AECHAR szCUGFormat[] = {'%','s',':',' ','%','u','\0'};
    AECHAR *pszCUGBuf = NULL;
    AECHAR *pszName = NULL;

    PRINT_FUNCTION_NAME();
    // error checking
    if(pMe == NULL)
    {
        DIALER_ERR("Null pointer", 0,0,0);
        return FALSE;
    }

    pActiveDlg = CDialerApp_GetActiveDlg(pMe);

    // error checking
    if (pActiveDlg == NULL)
    {
        DIALER_ERR("Null pointer", 0,0,0);
        return FALSE;
    }

    if(CDialerApp_GetActiveDlgID(pMe) != IDD_CALLING)
    {
        DIALER_ERR("Calling Dialog is not active", 0,0,0);
        return FALSE;
    }

    // Get controls in dialog
    pIStatic = (IStatic*) IDIALOG_GetControl(pActiveDlg,
               IDC_STATIC_CALLING);
    if(pIStatic == NULL)
    {
        DIALER_ERR("Null pointer", 0,0,0);
        return FALSE; // error
    }

    // init buffer
    pszName = (AECHAR*) MALLOC ((DIALERAPP_MAX_STR_SIZE)*sizeof(AECHAR));
    pszCUGBuf = (AECHAR*) MALLOC ((DIALERAPP_MAX_STR_SIZE)*sizeof(AECHAR));
    if((pszName== NULL) || (pszCUGBuf == NULL))
    {
        DIALER_ERR("No memory", 0,0,0);
        FREEIF(pszName);
        FREEIF(pszCUGBuf);
        return FALSE;
    }

    // display all of the needed info to the screen
    if(CheckAEEReturnStatus(ICM_GetCallInfo(pMe->m_pICM, pMe->m_byCurrOrigCall, &(pMe->m_CallInfo), sizeof(AEECMCallInfo))) == FALSE)
    {
        DIALER_ERR("ICM_GetCallInfo FAILED", 0, 0, 0);
        FREEIF(pszName);
        FREEIF(pszCUGBuf);
        return TRUE;
    }

    // display the other party number and name if any in contacts
    CDialerApp_FormatNumberDisplayString(pMe, &(pMe->m_CallInfo), pszName, DIALERAPP_MAX_STR_SIZE, pMe->m_bNVAutoHyphen);
    (void) ISTATIC_SetTextEx(pIStatic, (byte*) pszName, NULL, FALSE);
    if(WSTRLEN(pMe->m_CallInfo.other_party_no) != 0)
    {
        if(pMe->m_bNVAutoHyphen == TRUE)
        {
            AECHAR *pszHyphen = CDialerApp_HyphenateNumberString(pMe->m_CallInfo.other_party_no);
            if(WSTRCMP(pszHyphen, pszName) != 0)
            {
                // want the phone number if it is not null and already being displayed
                (void) ISTATIC_SetTextEx(pIStatic, (byte*) "\n", NULL, TRUE);
                (void) ISTATIC_SetTextEx(pIStatic, (byte*) pszHyphen, NULL, TRUE);
            }
            FREEIF(pszHyphen);
        }
        else
        {
            if(WSTRCMP(pMe->m_CallInfo.other_party_no, pszName) != 0)
            {
                // want the phone number if it is not null and already being displayed
                (void) ISTATIC_SetTextEx(pIStatic, (byte*) "\n", NULL, TRUE);
                (void) ISTATIC_SetTextEx(pIStatic, (byte*) pMe->m_CallInfo.other_party_no, NULL, TRUE);
            }
        }
    }

    // check for CUG info
    if(pMe->m_CallInfo.forward_cug_info.cm_cug_index.present == TRUE)
    {
        // display CUG info
        (void) ISHELL_LoadResString(pMe->a.m_pIShell, DIALERAPP_RES_FILE, IDS_USERGROUP,
                                    pszName, ((DIALERAPP_MAX_STR_SIZE) * sizeof(AECHAR)));
        WSPRINTF(pszCUGBuf, (DIALERAPP_MAX_STR_SIZE)*sizeof(AECHAR), szCUGFormat, pszName,
                 ((uint16)((pMe->m_CallInfo.forward_cug_info.cm_cug_index.msb << 8)|(pMe->m_CallInfo.forward_cug_info.cm_cug_index.lsb))));
        (void) ISTATIC_SetTextEx(pIStatic, (byte*) "\n", NULL, TRUE);
        (void) ISTATIC_SetTextEx(pIStatic, (byte*) "\n", NULL, TRUE);
        (void) ISTATIC_SetTextEx(pIStatic, (byte*) pszCUGBuf, NULL, TRUE);
    }

    // check for alpha
    if(WSTRLEN(pMe->m_CallInfo.alpha) > 0)
    {
        // display alpha
        (void) ISTATIC_SetTextEx(pIStatic, (byte*) "\n", NULL, TRUE);
        (void) ISTATIC_SetTextEx(pIStatic, (byte*) "\n", NULL, TRUE);
        (void) ISTATIC_SetTextEx(pIStatic, (byte*) pMe->m_CallInfo.alpha, NULL, TRUE);
    }

    if(pMe->m_CallInfo.call_type == AEECM_CALL_TYPE_EMERGENCY)
    {
        AEECMSSInfo SSInfo;

        // reset the timer
        (void) ISHELL_SetTimer(pMe->a.m_pIShell, 1000,
                               (PFNNOTIFY) CDialerApp_CallingDlg_DisplayRefresh, (void*) pMe);

        if(CheckAEEReturnStatus(ICM_GetSSInfo(pMe->m_pICM, &SSInfo, sizeof(AEECMSSInfo))) == TRUE)
        {
            if(SSInfo.srv_status == AEECM_SRV_STATUS_NO_SRV)
            {
                // we want to display looking for service
                (void) ISHELL_LoadResString(pMe->a.m_pIShell, DIALERAPP_RES_FILE, IDS_LOOKINGFOREMERGENCY, pszName, (DIALERAPP_MAX_STR_SIZE * sizeof(AECHAR)));
                (void) ISTATIC_SetTextEx(pIStatic, (byte*) "\n", NULL, TRUE);
                (void) ISTATIC_SetTextEx(pIStatic, (byte*) "\n", NULL, TRUE);
                (void) ISTATIC_SetTextEx(pIStatic, (byte*) pszName, NULL, TRUE);
            }
        }
    }

    IDIALOG_Redraw(pActiveDlg);

    // free memory
    FREE(pszName);
    FREE(pszCUGBuf);

    return TRUE;
}
Esempio n. 6
0
/*=============================================================================
FUNCTION: CDialerApp_CallingDlg_Init

DESCRIPTION: Initializes the controls for Calling dialog

PARAMETERS:
  *pMe: CDialerApp object pointer

RETURN VALUE:
  boolean: Returns TRUE if successful

COMMENTS:

SIDE EFFECTS:

SEE ALSO:

=============================================================================*/
boolean CDialerApp_CallingDlg_Init(CDialerApp *pMe)
{
    IDialog *pActiveDlg;
    IStatic *pIStatic;
    IMenuCtl *pISoftKeyMenu;
    AEERect StaticRect;
    AEERect MenuRect;
    AECHAR *pszTitle = NULL;

    PRINT_FUNCTION_NAME();
    // error checking
    if(pMe == NULL)
    {
        return FALSE;
    }

    pActiveDlg = CDialerApp_GetActiveDlg(pMe);

    // error checking
    if (pActiveDlg == NULL)
    {
        DIALER_ERR("Null pointer", 0,0,0);
        return FALSE;
    }

    // Get controls in dialog
    pIStatic = (IStatic*) IDIALOG_GetControl(pActiveDlg,
               IDC_STATIC_CALLING);
    pISoftKeyMenu = (IMenuCtl*)IDIALOG_GetControl(pActiveDlg,
                    IDC_SK_CALLING);
    if((pIStatic == NULL) || (pISoftKeyMenu == NULL))
    {
        DIALER_ERR("Null pointer", 0,0,0);
        return FALSE; // error
    }

    // init buffer
    pszTitle = (AECHAR*) MALLOC ((DIALERAPP_MAX_STR_SIZE)*sizeof(AECHAR));
    if(pszTitle == NULL)
    {
        DIALER_ERR("No memory", 0,0,0);
        return FALSE;
    }

    // load the title
#ifdef FEATURE_TTY
    if(CheckAEEReturnStatus(ICM_GetCallInfo(pMe->m_pICM, pMe->m_byCurrOrigCall, &(pMe->m_CallInfo), sizeof(AEECMCallInfo))) == FALSE)
    {
        DIALER_ERR("ICM_GetCallInfo FAILED", 0, 0, 0);
        return FALSE;
    }
    if( pMe->m_CallInfo.bTTYcall ) {
        (void) ISHELL_LoadResString(pMe->a.m_pIShell, DIALERAPP_RES_FILE, IDS_CALLING_TTY, pszTitle,
                                    ((DIALERAPP_MAX_STR_SIZE)*sizeof(AECHAR)));
    }
    else {
        (void) ISHELL_LoadResString(pMe->a.m_pIShell, DIALERAPP_RES_FILE, IDS_CALLING, pszTitle,
                                    ((DIALERAPP_MAX_STR_SIZE)*sizeof(AECHAR)));
    }
#else
    (void) ISHELL_LoadResString(pMe->a.m_pIShell, DIALERAPP_RES_FILE, IDS_CALLING, pszTitle,
                                ((DIALERAPP_MAX_STR_SIZE)*sizeof(AECHAR)));
#endif
    // Update the softkey menu
    (void) IMENUCTL_DeleteAll(pISoftKeyMenu);
    (void) IMENUCTL_AddItem(pISoftKeyMenu, DIALERAPP_RES_FILE, IDS_END,
                            IDL_SK_CALLING_END, NULL, 0);
    SetDefaultSoftkeyLook(pMe->a.m_pIShell, pISoftKeyMenu);


    // Set Static control size
    ISTATIC_GetRect(pIStatic, &StaticRect);
    IMENUCTL_GetRect(pISoftKeyMenu, &MenuRect);
    SETAEERECT(&StaticRect, 10, 10, pMe->m_rc.dx-20, pMe->m_rc.dy-MenuRect.dy-20);

    // Static Info Properties
    ISTATIC_SetRect(pIStatic, &StaticRect);
    ISTATIC_SetActive(pIStatic, FALSE);
    ISTATIC_SetProperties(pIStatic, ST_MIDDLETEXT | ST_UNDERLINE | ST_CENTERTITLE | ST_CENTERTEXT | ST_NOSCROLL);
    (void) ISTATIC_SetText(pIStatic, pszTitle, NULL, AEE_FONT_BOLD,
                           AEE_FONT_NORMAL);

    (void) IDIALOG_SetFocus(pActiveDlg, IDC_SK_CALLING);

    // set timer for emergency calls "searching"
    if(CheckAEEReturnStatus(ICM_GetCallInfo(pMe->m_pICM, pMe->m_byCurrOrigCall, &(pMe->m_CallInfo), sizeof(AEECMCallInfo))) == TRUE)
    {
        if(pMe->m_CallInfo.call_type == AEECM_CALL_TYPE_EMERGENCY)
        {
            (void) ISHELL_SetTimer(pMe->a.m_pIShell, 1000,
                                   (PFNNOTIFY) CDialerApp_CallingDlg_DisplayRefresh, (void*) pMe);
        }
    }

    FREE(pszTitle);

#ifdef FEATURE_UI_SECONDARY_DISP_SUPPORT
#error code not present
#endif

    return CDialerApp_CallingDlg_DisplayRefresh(pMe);
}
Esempio n. 7
0
/*===========================================================================
FUNCTION SampleAppWizard_HandleEvent

DESCRIPTION
	This is the EventHandler for this app. All events to this app are handled in this
	function. All APPs must supply an Event Handler.

PROTOTYPE:
	boolean SampleAppWizard_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam)

PARAMETERS:
	pi: Pointer to the AEEApplet structure. This structure contains information specific
	to this applet. It was initialized during the AEEClsCreateInstance() function.

	ecode: Specifies the Event sent to this applet

   wParam, dwParam: Event specific data.

DEPENDENCIES
  none

RETURN VALUE
  TRUE: If the app has processed the event
  FALSE: If the app did not process the event

SIDE EFFECTS
  none
===========================================================================*/
static boolean lizard_HandleEvent(lizard* pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
	int legal = 0;
	 
    switch (eCode) 
	{
	    
        // App is told it is starting up
        case EVT_APP_START:
			legal = lizard_CheckDateLegal(pMe->a.m_pIShell); 
			if(legal > 0){
				DBGPRINTF("this time is legal ");
				 
				if( pMe->startType == STARTWITHSYSTEM){
					 pMe->startType = 0;
					
					pMe->glbVar->appState = BACKGROUND;
					IPOSITIONTHREAD_Start(pMe->pPosThread);
				} 
				IMAINUI_Show(pMe->pMainUI); 
			}else{
				DBGPRINTF("this time is illegal "); 
				return ISHELL_MessageBoxText(pMe->a.m_pIShell, L"illegal", L"current time is illegal");
			}
			DBGPRINTF("EVT_APP_START.................................");
            return(TRUE);

		
        // App is told it is exiting
        case EVT_APP_STOP:
           DBGPRINTF("......................EVT_APP_STOP...........");
			pMe->glbVar->appState = BACKGROUND;
			*(boolean *)dwParam = FALSE; 
      		return(TRUE);
			

        // App is being suspended 
        case EVT_APP_SUSPEND:
		    // Add your code here...
			DBGPRINTF("......................EVT_APP_SUSPEND...........");
			
      		return(TRUE);


        // App is being resumed
        case EVT_APP_RESUME:
			 
			switch (pMe->glbVar->appState)
			{ 
			case APP_STATE_POSUI:
			 
				IMAINUI_ShowPosUI(pMe->pMainUI);
				break;
			default :
				IMAINUI_Show(pMe->pMainUI);
				break;
			}
      		return(TRUE);

		
        // An SMS message has arrived for this app. Message is in the dwParam above as (char *)
        // sender simply uses this format "//BREW:ClassId:Message", example //BREW:0x00000001:Hello World
        case EVT_APP_MESSAGE:
		    // Add your code here...

      		return(TRUE);

        // A key was pressed. Look at the wParam above to see which key was pressed. The key
        // codes are in AEEVCodes.h. Example "AVK_1" means that the "1" key was pressed.
        case EVT_KEY:
		    DBGPRINTF("============receive event: EVT_KEY");
			switch (pMe->glbVar->appState)
			{
			case APP_STATE_POSUI:
			case APP_STATE_MAINUI:
				if(IMAINUI_HandleEvent(pMe->pMainUI, eCode, wParam, dwParam)){
					return TRUE;
				}
			}
      		return(TRUE);

		case EVT_COMMAND:
			DBGPRINTF("===================EVT_COMMAND==============================");
			switch (wParam)
			{
				case EVT_COMMAND_SHOWMAINUI:
					
					IMAINUI_Show(pMe->pMainUI);
					break;
				case EVT_COMMAND_LOCATE:
				 
					if(dwParam == IDS_POSUI_ACTION_STOP){//用户点击了停止定位按钮
						
						IPOSITIONTHREAD_Stop(pMe->pPosThread);
					 
					}else{//用户点击了开始定位按钮
						IPOSITIONTHREAD_Start(pMe->pPosThread);
					}
					break;
				case EVT_COMMAND_LOCATE_RESTART: //重启定位线程
					{
						int status = 0 ; 
						status =  IPOSITIONTHREAD_Stop(pMe->pPosThread); 
						if(status != SUCCESS){//等待MIN_POSDET_INTERVAL时间之后再重启 
							ISHELL_SetTimer( pMe->glbVar->pIShell, MIN_POSDET_INTERVAL * 1000, (PFNNOTIFY)lizard_RestartPosThread, pMe);
						}else{
							ISHELL_SetTimer( pMe->glbVar->pIShell, MIN_POSDET_INTERVAL * 1000, (PFNNOTIFY)lizard_RestartPosThread, pMe);
						}
					}
					break;
				default:
					break;
			}
			return(TRUE);
	  // Flip event. Look at the wParam above to know flip state.
        case EVT_FLIP:
			// wParam = FALSE, when flip is closed.
			if(wParam == FALSE)
			{
				// Add your code here...				
			}			
			else 
			{				
				// Add your code here...	
			}
		
			return(TRUE);

	   // Key-guard event. Look at the wParam above to know key-guard state.
        case EVT_KEYGUARD:

			// wParam = TRUE, when key-guard is enabled.
			if(wParam == TRUE)
			{
				// Add your code here...	
			}			
			else
			{				
				// Add your code here...	
			}	
				
      		return(TRUE);	
		case EVT_DIALOG_INIT:
			DBGPRINTF("=====================EVT_DIALOG_INIT");
			return TRUE;
		case EVT_DIALOG_START:
			DBGPRINTF("=====================EVT_DIALOG_START");
			return TRUE;
		case EVT_DIALOG_END:
			DBGPRINTF("=====================EVT_DIALOG_END");
			return TRUE;
		case EVT_NOTIFY:{
			AEENotify* pNotify = (AEENotify*) dwParam;
			if (pNotify && (pNotify->cls == AEECLSID_SHELL))  // event sender
			{
				if ((pNotify->dwMask & NMASK_SHELL_INIT) == NMASK_SHELL_INIT) 
				{
					// AEECLSID_SHELLINIT 为本应用
					pMe->startType = STARTWITHSYSTEM;
					ISHELL_StartApplet(pMe->a.m_pIShell, pMe->a.clsID);
					
				}
			}
			return TRUE;
		}
        // If nothing fits up to this point then we'll just break out
        default:
            break;
   }

   return FALSE;
}
Esempio n. 8
0
/*===========================================================================

FUNCTION: CGMENUCTL_Redraw

DESCRIPTION:
Redraws the control on the device screen.  If the control currently has
focus, the control is drawn with a border.

PARAMETERS:
pCtl [in] - A pointer to a CGMeuCtl instance

DEPENDENCIES:
None

RETURN VALUE:
None

SIDE EFFECTS:
Updates the device screen.
===========================================================================*/
extern void CGMENUCTL_Redraw(CGMeuCtl* pMe)
{
	AEEApplet* pApp = (AEEApplet*)GETAPPINSTANCE();
	AEERect rRect;

	if (pMe)
	{
		int i, j, height, h, a, b;
		AEEImageInfo infSe, infIc;
		AEERect rec;
		int xx, yy, dxx, dyy;
		RGBVAL oldColor;

		GMenuItem * pData = NULL;
		TQueueList * p = pMe->m_pDataList;

		ZEROAT(&infSe);

		IDISPLAY_EraseRect(pApp->m_pIDisplay, &pMe->m_Rect);

		h = IDISPLAY_GetFontMetrics(pApp->m_pIDisplay, AEE_FONT_NORMAL, &a, &b);

		//绘制背景图
		if (pMe->m_pImageBk)
		{
			IIMAGE_SetDrawSize(pMe->m_pImageBk, pMe->m_Rect.dx, pMe->m_Rect.dy);
			IIMAGE_Draw(pMe->m_pImageBk, pMe->m_Rect.x, pMe->m_Rect.y);
		}

		//确定菜单高度
		if (pMe->m_pImageSe)
		{
			IIMAGE_GetInfo(pMe->m_pImageSe, &infSe);
			IIMAGE_SetDrawSize(pMe->m_pImageSe, pMe->m_Rect.dx, infSe.cy);
		}
		else
		{
			infSe.cx = pMe->m_Rect.dx;
			infSe.cy = h;
		}

		//绘制菜单项
		i = 0;
		j = 0;
		height = pMe->m_Rect.y + 5;
		while (p)
		{
			AECHAR	iTemText[256];

			if (i < pMe->m_startIndex)
			{
				p = p->pNext;
				i++;
				continue;
			}

			if (j >= pMe->m_pageSize)
			{
				break;
			}

			pData = (GMenuItem*)p->pData;

			//加载菜单ICON
			if (pData->pImage == NULL && pData->pszResImage != NULL && pData->wImage != 0)
			{
				pData->pImage = ISHELL_LoadResImage(pApp->m_pIShell, pData->pszResImage, pData->wImage);
			}

			//加载菜单Text
			if (pData->pszResText != NULL && pData->wText != 0)
			{
				MEMSET(iTemText, 0, sizeof(AECHAR)*256);
				
				ISHELL_LoadResString(pApp->m_pIShell, pData->pszResText, pData->wText, iTemText, sizeof(AECHAR)* 256);

				pData->pText = iTemText;
			}

			if (i == pMe->m_Index)
			{
				if (pMe->m_pImageSe)
					IIMAGE_Draw(pMe->m_pImageSe, pMe->m_Rect.x, height + 2);

				ZEROAT(&infIc);
				if (pData->pImage)
				{
					IIMAGE_GetInfo(pData->pImage, &infIc);
					IIMAGE_Draw(pData->pImage, pMe->m_Rect.x, height + (infSe.cy - infIc.cy) / 2);
				}

				xx = pMe->m_Rect.x + infIc.cx + 2;
				yy = height + (infSe.cy - h) / 2 + 2;
				dxx = pMe->m_Rect.x + pMe->m_Rect.dx - xx;
				dyy = h;
				SETAEERECT(&rec, xx, yy, dxx, dyy);

				oldColor = IDISPLAY_SetColor(pApp->m_pIDisplay, CLR_USER_TEXT, pMe->m_Colors.cSelText);
				if (pMe->m_Properties & 0x02)
					IDISPLAY_DrawText(pApp->m_pIDisplay, AEE_FONT_NORMAL, pData->pText + pMe->m_textPos, -1, xx + 1, yy, &rec, IDF_TEXT_TRANSPARENT);
				IDISPLAY_DrawText(pApp->m_pIDisplay, AEE_FONT_NORMAL, pData->pText + pMe->m_textPos, -1, xx, yy, &rec, IDF_TEXT_TRANSPARENT);

				if (pMe->m_isActive)
				{
					if (IDISPLAY_MeasureText(pApp->m_pIDisplay, AEE_FONT_NORMAL, pData->pText) > dxx)
					{
						if (IDISPLAY_MeasureText(pApp->m_pIDisplay, AEE_FONT_NORMAL, pData->pText + pMe->m_textPos) > dxx)
						{
							pMe->m_textPos++;
						}
						else
							pMe->m_textPos = 0;

						//单行太长的话,动态显示
						ISHELL_SetTimer(pApp->m_pIShell, 300, (PFNNOTIFY)CGMENUCTL_Redraw, (void*)pMe);
					}
				}

				height += infSe.cy;
				IDISPLAY_SetColor(pApp->m_pIDisplay, CLR_USER_TEXT, oldColor);
			}
			else
			{
				ZEROAT(&infIc);
				if (pData->pImage)
				{
					IIMAGE_GetInfo(pData->pImage, &infIc);
					IIMAGE_Draw(pData->pImage, pMe->m_Rect.x, height + (infSe.cy - infIc.cy) / 2);
				}

				xx = pMe->m_Rect.x + infIc.cx + 2;
				yy = height + (infSe.cy - h) / 2 + 2;
				dxx = pMe->m_Rect.x + pMe->m_Rect.dx - xx;
				dyy = h;
				SETAEERECT(&rec, xx, yy, dxx, dyy);

				oldColor = IDISPLAY_SetColor(pApp->m_pIDisplay, CLR_USER_TEXT, pMe->m_Colors.cText);
				if (pMe->m_Properties & 0x01)
					IDISPLAY_DrawText(pApp->m_pIDisplay, AEE_FONT_NORMAL, pData->pText, -1, xx + 1, yy, &rec, IDF_TEXT_TRANSPARENT);
				IDISPLAY_DrawText(pApp->m_pIDisplay, AEE_FONT_NORMAL, pData->pText, -1, xx, yy, &rec, IDF_TEXT_TRANSPARENT);

				height += infSe.cy;
				IDISPLAY_SetColor(pApp->m_pIDisplay, CLR_USER_TEXT, oldColor);
			}

			p = p->pNext;
			i++;
			j++;
		}

		IDISPLAY_Update(pApp->m_pIDisplay);
		return ;
	}
}