160 likes | 276 Views
10. IDisplay API (1). IDisplay 인터페이스 함수는 직선이나 직사각형과 같은 단순한 기하 모양 , 텍스트 및 비트맵을 장치 디스플레이에 그릴 수 있다 . 10.1 IDisplay 함수 텍스트 IDISPLAY_DrawText 함수 : 주어진 글꼴을 사용하여 화면에 지정된 x, y 좌표에 텍스트 문자 열을 그린다. 10. IDisplay API (1). 클리핑 (clipping) 이란 , 레이어의 영역 중 일부를 숨기고 , 나머지 부분만 보이게 하는 효과
E N D
10. IDisplay API (1) • IDisplay 인터페이스 함수는 직선이나 직사각형과 같은 단순한 기하 모양, 텍스트 및 비트맵을 장치 디스플레이에 그릴 수 있다. • 10.1 IDisplay 함수 • 텍스트 • IDISPLAY_DrawText 함수: 주어진 글꼴을 사용하여 화면에 지정된 x, y 좌표에 텍스트 문자 • 열을 그린다. 임베디드 모바일 프로그래밍
10. IDisplay API (1) • 클리핑(clipping)이란, 레이어의 영역 중 일부를 숨기고, 나머지 부분만 보이게 하는 효과 입니다. 보이는 영역이 클리핑 영역이 됩니다. 임베디드 모바일 프로그래밍
10. IDisplay API (1) (2) IDISPLAY_GetFontMetrics 함수: 지정한 글꼴의 텍스트 높이를 픽셀 단위로 변환한다. 임베디드 모바일 프로그래밍
10. IDisplay API (1) (3) IDISPLAY_MeasureTextEx 함수: 한 라인에 출력될 수 있는 문자의 개수를 구한다. 임베디드 모바일 프로그래밍
10. IDisplay API (1) (4) IDISPLAY_EraseRect 함수: 주어진 사각형 영역(pRect)을 배경색 (CLR_USER_BACKGROUND)으로 채운다. 배경색은 IDISPLAY_SetColor() 함수를 통해 변경할 수 있다. 임베디드 모바일 프로그래밍
10. IDisplay API (1) (5) IDISPLAY_Update 함수: 화면에 그리기 동작을 수행한다. 임베디드 모바일 프로그래밍
10. IDisplay API (1) 10.2 IDisplay – 텍스트 프로그램 (IDisplayEx) /*=============================================================================== INCLUDES AND VARIABLE DEFINITIONS =============================================================================== */ #include "AEEModGen.h" // Module interface definitions #include "AEEAppGen.h" // Applet interface definitions #include "AEEShell.h" // Shell interface definitions #include "AEEMenu.h" #include "AEEStdLib.h" #include "AEEDisp.h" #include "IDisplayEx.bid" #define MENU_EVT_DISPLAY 401 typedef struct _CIDisplayEx { AEEApplet a; // Mandatory first AEEApplet data member IMenuCtl * m_pIMenu; // Device parameters int m_nLineHeight; int m_nButton; int m_nDrawRect; int m_nFrame; int m_nDrawLine; AEEDeviceInfo m_dInfo; } CIDisplayEx; 임베디드 모바일 프로그래밍
10. IDisplay API (1) /*------------------------------------------------------------------- Function Prototypes -------------------------------------------------------------------*/ // IShellExample 애플릿에서 발생하는 이벤트 처리 함수 static boolean IDisplayEx_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam); static boolean IDisplayEx_InitAppData(IApplet* pMe); static void IDisplayEx_FreeAppData(IApplet* pMe); static void DisplayOutput(IApplet * pMe, int nline, char *pszStr, RGBVAL clrColor); AECHAR* _STR_TO_WSTR(char* pszIn, AECHAR* pDest, int nSize); int AEEClsCreateInstance(AEECLSID ClsId,IShell * pIShell,IModule * po, void ** ppObj) { *ppObj = NULL; if(ClsId == AEECLSID_IDISPLAYEX){ if(AEEApplet_New(sizeof(CIDisplayEx), ClsId, pIShell,po,(IApplet**)ppObj, (AEEHANDLER)IDisplayEx_HandleEvent,(PFNFREEAPPDATA)IDisplayEx_FreeAppData) == TRUE) { if (IDisplayEx_InitAppData((IApplet*)*ppObj) == TRUE) return(AEE_SUCCESS); } } return (EFAILED); } 임베디드 모바일 프로그래밍
10. IDisplay API (1) static boolean IDisplayEx_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam) { CIDisplayEx * pMe = (CIDisplayEx *)pi; AEERect rc; AECHAR szBuf[50]; AEEMenuColors mclr; SETAEERECT (&rc, 0, 0, pMe->m_dInfo.cxScreen, pMe->m_dInfo.cyScreen); switch (eCode) { case EVT_APP_START: // 알람 정보를 등록할 메뉴 컨트롤을 생성한다. if(ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_MENUCTL, (void **)&pMe->m_pIMenu) != SUCCESS) { return FALSE; } // 선택된 메뉴의 색상을 설정한다 mclr.wMask = MC_BACK|MC_TEXT|MC_SEL_BACK|MC_SEL_TEXT|MC_SCROLLBAR|MC_SCROLLBAR_FILL|MC_FRAME; mclr.cBack = RGB_WHITE; mclr.cText = RGB_BLACK; //mclr.cSelBack = MAKE_RGB (146, 109, 255); mclr.cSelBack = MAKE_RGB (124, 109, 197); mclr.cSelText = RGB_BLACK; mclr.cFrame = RGB_WHITE; 임베디드 모바일 프로그래밍
10. IDisplay API (1) IMENUCTL_SetColors (pMe->m_pIMenu, &mclr); _STR_TO_WSTR("IDisplay 예제", szBuf, sizeof(szBuf)); IMENUCTL_SetTitle(pMe->m_pIMenu, NULL, 0, szBuf); IMENUCTL_SetRect(pMe->m_pIMenu, &rc); // Add CreateInstance to menu _STR_TO_WSTR("1. 텍스트 처리", szBuf, sizeof(szBuf)); IMENUCTL_AddItem(pMe->m_pIMenu, 0, 0, MENU_EVT_DISPLAY, szBuf, 0); IMENUCTL_SetActive(pMe->m_pIMenu,TRUE); return(TRUE); // 애플릿이 종료될 때 발생하는 이벤트이다. case EVT_APP_STOP: return(TRUE); case EVT_APP_SUSPEND: return TRUE; case EVT_APP_RESUME: return TRUE; case EVT_ALARM: return TRUE; case EVT_DIALOG_INIT: return TRUE; case EVT_DIALOG_START: return TRUE; case EVT_DIALOG_END: return TRUE; // EVT_KEY 이벤트를 처리하지 않으면 특정 메뉴 아이템을 선택했을 때 원하는 작업을 // 수행할 수 없다. 여기서 발생하는 이벤트를 EVT_COMMAND 로 보내게 된다. // 대화 상자 이벤트 case EVT_KEY: return IMENUCTL_HandleEvent(pMe->m_pIMenu, EVT_KEY, wParam, 0); 임베디드 모바일 프로그래밍
10. IDisplay API (1) case EVT_COMMAND: switch(wParam) { case MENU_EVT_DISPLAY: { IDISPLAY_ClearScreen (pMe->a.m_pIDisplay); IMENUCTL_SetProperties(pMe->m_pIMenu, MP_NO_REDRAW); IMENUCTL_SetActive(pMe->m_pIMenu, FALSE); DisplayOutput((IApplet *)pMe, 1, "임베디드모바일프로그래밍", MAKE_RGB(0xff,0,0)); DisplayOutput((IApplet *)pMe, 3, "최 대환", MAKE_RGB(0,0,0xff)); DisplayOutput((IApplet *)pMe, 4, "전 윤정", MAKE_RGB(0,0,0xff)); DisplayOutput((IApplet *)pMe, 5, "전 지영", MAKE_RGB(0,0,0xff)); DisplayOutput((IApplet *)pMe, 6, "남 지영", MAKE_RGB(0,0,0xff)); return TRUE; } default: return FALSE; } default: break; } return FALSE; } 임베디드 모바일 프로그래밍
10. IDisplay API (1) static boolean IDisplayEx_InitAppData(IApplet* pi) { CIDisplayEx* pMe = (CIDisplayEx*)pi; int pnAscent = 0; int pnDescent = 0; // Initialize the MenuCtl pointer to NULL pMe->m_pIMenu = NULL; pMe->m_nButton = 0; pMe->m_nFrame = 0; pMe->m_nDrawLine = 0; pMe->m_nDrawRect = 0; pMe->m_nLineHeight = IDISPLAY_GetFontMetrics (pMe->a.m_pIDisplay, AEE_FONT_NORMAL, &pnAscent, &pnDescent); ISHELL_GetDeviceInfo(pMe->a.m_pIShell,&pMe->m_dInfo); return TRUE; } static void IDisplayEx_FreeAppData(IApplet* pi) { CIDisplayEx* pMe = (CIDisplayEx*)pi; // 메뉴 컨트롤이 해지가 되지 않았다면 해지한다. if (pMe->m_pIMenu != NULL) { // 메뉴 컨트롤 해지하는 함수 IMENUCTL_Release (pMe->m_pIMenu); pMe->m_pIMenu = NULL; } } 임베디드 모바일 프로그래밍
10. IDisplay API (1) static void DisplayOutput(IApplet * pi, int nline, char *pszStr, RGBVAL clrColor) { AEEDeviceInfo di; // Device Info AECHAR szBuf[200] = {0}; // a buffer that supports 200 char string 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; AEEApplet * pMe = (AEEApplet*)pi; if (pMe == NULL) return; // Get device information ISHELL_GetDeviceInfo(pMe->m_pIShell,&di); // Get the font metrics info charHeight = IDISPLAY_GetFontMetrics (pMe->m_pIDisplay, AEE_FONT_NORMAL, &pnAscent, &pnDescent); 출력될 문자열의 높이를 구한다. 임베디드 모바일 프로그래밍
10. IDisplay API (1) STREXPAND((const unsigned char *) pszStr, STRLEN(pszStr), szBuf, sizeof(szBuf)); if (nline < 0) { dy = di.cyScreen*2/5; } else{ dy = nline * charHeight; } psz = szBuf; totalCh = STRLEN ((char *)pszStr); while ((totalCh > 0) && (*psz != NULL)) { pixelWidth = IDISPLAY_MeasureTextEx(pMe->m_pIDisplay, font, (AECHAR *) psz, // Start of the buffer to display, -1, di.cxScreen - 5, // maxWidth &pnFits); // Number of chars that will fit a line if (pnFits == 0) return; SETAEERECT(&rc, 0, dy, di.cxScreen, charHeight); IDISPLAY_EraseRect(pMe->m_pIDisplay, &rc); IDISPLAY_SetColor(pMe->m_pIDisplay,CLR_USER_TEXT,clrColor); IDISPLAY_DrawText(pMe->m_pIDisplay, AEE_FONT_NORMAL, psz, pnFits, 5 /*start dx*/, dy, 0 /* use default rectangle coordinates */, 0); AEEDeviceInfo 구조체 typedef struct { uint cxScreen; uint cyScreen; //실제 세로화면 크기 (픽셀) … 1바이트를 2바이트 문자열로 변환 한라인에 출력될 문자의 개수를 구한다. 한 라인에 출력할 개수 만큼 문자를 출력한다. 임베디드 모바일 프로그래밍
10. IDisplay API (1) 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(pMe->m_pIDisplay); if (totalCh < pnFits) pnFits = totalCh; // if total number is less than pnFits, adjust pnFits } return; } AECHAR* _STR_TO_WSTR(char* pszIn, AECHAR* pDest, int nSize) { char* psSource = pszIn; char* pcDestin = (char *)pDest; int npszInSize = STRLEN(pszIn); MEMSET(pDest, 0, nSize); for(psSource = pszIn; psSource < (pszIn + npszInSize); psSource++) { if ((*psSource) < 0 || (*psSource) >= 128) { *pcDestin = *psSource; pcDestin += 1; } else { *pcDestin = *psSource; pcDestin += 1; *pcDestin = 0; pcDestin += 1; } } return (AECHAR*)pcDestin; } 임베디드 모바일 프로그래밍
10. IDisplay API (1) 10.3 실행 결과 임베디드 모바일 프로그래밍