// 设置窗口定时器 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; }
/*=========================================================================== 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); } }
//============================================================================= //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); }
/*=========================================================================== ===========================================================================*/ 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; }
/*============================================================================= 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; }
/*============================================================================= 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); }
/*=========================================================================== 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; }
/*=========================================================================== 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 ; } }