Presentation is loading. Please wait.

Presentation is loading. Please wait.

임베디드 모바일 프로그래밍 1 11. IDisplay API (2) 11.1 IDisplay API 서비스 – 간단한 도형 그리기 IDISPLAY_DrawRect 함수 - 지정한 색과 플래그를 사용하여 주어진 사각형을 그리는 함수 - IDISPLAY_DrawRect 함수의.

Similar presentations


Presentation on theme: "임베디드 모바일 프로그래밍 1 11. IDisplay API (2) 11.1 IDisplay API 서비스 – 간단한 도형 그리기 IDISPLAY_DrawRect 함수 - 지정한 색과 플래그를 사용하여 주어진 사각형을 그리는 함수 - IDISPLAY_DrawRect 함수의."— Presentation transcript:

1 임베디드 모바일 프로그래밍 IDisplay API (2) 11.1 IDisplay API 서비스 – 간단한 도형 그리기 IDISPLAY_DrawRect 함수 - 지정한 색과 플래그를 사용하여 주어진 사각형을 그리는 함수 - IDISPLAY_DrawRect 함수의 형식 함수 형식 Void IDISPLAY_DrawRect(Idisplay *pIDisplay, const AEERect *pRect, RGBVAL clrFrame, RGBVAL clrFill, uint32 dwFlags) 기 능지정한 색과 플래그를 사용하여 여러가지 모양의 사각형을 그리는 함수 함수 인자 pIDisplay IDisplay 인터페이스 포인터 pRect 사각형이 표현될 좌표를 지정한다. clrFrame 프레임의 색을 지정한다. clrFill 사각형을 채울 색을 지정한다. dwFlags 플래그 값, IDF_RECT_FRAME, IDF_RECT_FILL, IDF_RECT_INVERT 반환값없음

2 임베디드 모바일 프로그래밍 IDisplay API (2) IDisplay_FrameButton 함수 - 시스템 색 해상도에 따라 3D 프레임 단추를 그리는 함수 - IDisplay_FrameButton 함수의 형식 함수 형식 Void IDISPLAY_FrameButton(IDisplay * pIDisplay, AEERect * prc, boolean bPressed, RGBVAL clrFill) 기 능기 능버튼을 3D 프레임 효과를 줄 때 사용한다. 함수 인자 pIDisplay IDisplay 인터페이스 포인터 prc 버튼을 표현할 좌표를 지정한다. pPressed 버튼의 누름 상태를 지정한다. - TRUE: 눌린 버튼 - FALSE: 올라온 버튼 clrFill 채우기에 사용되는 색상 정보 반환값없음

3 임베디드 모바일 프로그래밍 IDisplay API (2) IDISPLAY_DrawFrame 함수 - 시스템의 색 해상도에 따라 복잡한 프레임을 그리는 함수 - IDISPLAY_DrawFrame 함수의 형식 함수 형식 Int IDISPLAY_DrawFrame(IDisplay * pIDisplay, AEERect * prc, AEEFrameType ft, RGBVAL clrFill) 기 능기 능프레임을 생성하기 위하여 사용하며 채우기 색상을 지정할 수 있다. 함수 인자 pIDisplay IDisplay 인터페이스 포인터 prc 프레임을 나타낼 좌표를 지정한다. ft 프레임의 유형을 나타낸다. clrFill 채우기에 사용되는 색상 정보 반환값없음

4 임베디드 모바일 프로그래밍 IDisplay API (2) IDISPLAY_DrawHLine 함수 - 수평선을 그린다. - IDISPLAY_DrawHLine 함수의 형식 함수 형식 Void IDISPLAY_DrawHLine(IDisplay * pIDisplay, int16 x, int16 y, int16 len) 기 능기 능수평선을 그린다. 함수 인자 pIDisplay IDisplay 인터페이스 포인터 X 수평선이 시작될 X 좌표 Y 수평선이 시작될 Y 좌표 Len 수평선 길이 반환값없 음없 음

5 임베디드 모바일 프로그래밍 IDisplay API (2) IDISPLAY_DrawVLine 함수 - 수직선을 그린다. - IDISPLAY_DrawVLine 함수의 형식 함수 형식 Void IDISPLAY_DrawVLine(IDisplay * pIDisplay, int16 x, int16 y, int16 len) 기 능기 능수직선을 그린다. 함수 인자 pIDisplay IDisplay 인터페이스 포인터 X 수직선이 시작될 X 좌표 Y 수직선이 시작될 Y 좌표 Len 수직선 길이 반환값없음

6 임베디드 모바일 프로그래밍 IDisplay API (2) 11.2 IDisplay API – 도형 그리기 프로그램 (IdisplayEx2) 블록 다이어그램 IDisplay 예제 메뉴 EVT_KEY  EVT_COMMAND DisplayFrameButton(pMe, TRUE); pMe->m_nButton=1; DisplayFrameButton(pMe, FALSE); pMe->m_nDrawRect=2; pMe->m_nDrawRect+=1; IDISPLAY_DrawRecct() pMe->m_nDrawRect 가 5 일때 까지 반복 DisplayOutput() pMe->m_nFrame=1; Display_Output(); fType 설정 ; IDISPLAY_DrawFrame(); IDISPLAY_Update(); pMe->m_nFrame 이 9 일때 까지 반복 pMe->m_nDrawLine=1; IDISPLAY_DrawHLine(); 과 IDISPLAY_DrawVLine(); 를 2 번 실행 MENU_EVT_BITBLT MENU_EVT_FRAME BUTTON MENU_EVT_DRAWR ECT ISHELL_LoadResData(); IDISPLAY_BitBlt(); IDISPLAY_Update() MENU_EVT_DISPLAY MENU_EVT_DRAWF RAME MENU_EVT_DRAWLI NE

7 임베디드 모바일 프로그래밍 IDisplay API (2) 소스 프로그램 /*=============================================================================== 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 "IDisplayEx2.bid" #include "IDisplayEx2_res.h" #define MENU_EVT_DISPLAY401 #define MENU_EVT_BITBLT402 #define MENU_EVT_FRAMEBUTTON403 #define MENU_EVT_DRAWRECT404 #define MENU_EVT_DRAWFRAME405 #define MENU_EVT_DRAWLINE406 #define APP_RES_FILE "IDisplayEx2.bar"

8 임베디드 모바일 프로그래밍 IDisplay API (2) typedef struct _CIDisplayEx2 { AEEAppleta; // Mandatory first AEEApplet data member IMenuCtl * m_pIMenu; // Device parameters int m_nLineHeight; intm_nButton; intm_nDrawRect; intm_nFrame; intm_nDrawLine; AEEDeviceInfo m_dInfo; } CIDisplayEx2; /* Function Prototypes */ // IShellExample 애플릿에서 발생하는 이벤트 처리 함수 static boolean IDisplayEx2_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam); static boolean IDisplayEx2_InitAppData(IApplet* pMe); static void IDisplayEx2_FreeAppData(IApplet* pMe); static void DisplayOutput(IApplet * pMe, int nline, char *pszStr, RGBVAL clrColor); static void DisplayMenu(CIDisplayEx2 *pMe); static void DisplayFrameButton(CIDisplayEx2 *pMe, boolean buttonType);

9 임베디드 모바일 프로그래밍 IDisplay API (2) int AEEClsCreateInstance(AEECLSID ClsId,IShell * pIShell,IModule * po, void ** ppObj) { *ppObj = NULL; if(ClsId == AEECLSID_IDISPLAYEX2){ if(AEEApplet_New(sizeof(CIDisplayEx2), ClsId, pIShell,po,(IApplet**)ppObj, (AEEHANDLER)IDisplayEx2_HandleEvent,(PFNFREEAPPDATA)IDisplayEx2_FreeAppData) == TRUE) { if (IDisplayEx2_InitAppData((IApplet*)*ppObj) == TRUE) return(AEE_SUCCESS); } return (EFAILED); } static boolean IDisplayEx2_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam) { CIDisplayEx2 * pMe = (CIDisplayEx2 *)pi; AEERect rc; AECHAR szBuf[50]; AEEMenuColors mclr; SETAEERECT (&rc, 0, 0, pMe->m_dInfo.cxScreen, pMe->m_dInfo.cyScreen);

10 임베디드 모바일 프로그래밍 IDisplay API (2) 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; IMENUCTL_SetColors (pMe->m_pIMenu, &mclr); STREXPAND((const unsigned char *)"IDisplay 예제 ", STRLEN("IDisplay 예제 "), szBuf, sizeof(szBuf)); IMENUCTL_SetTitle(pMe->m_pIMenu, NULL, 0, szBuf); IMENUCTL_SetRect(pMe->m_pIMenu, &rc); // Add CreateInstance to menu

11 임베디드 모바일 프로그래밍 IDisplay API (2) STREXPAND((const unsigned char *)"1. 텍스트 처리 ", STRLEN("1. 텍스트 처리 "), szBuf, sizeof(szBuf)); IMENUCTL_AddItem(pMe->m_pIMenu, 0, 0, MENU_EVT_DISPLAY, szBuf, 0); STREXPAND((const unsigned char *)"2. 비트맵 이미지 ", STRLEN("2. 비트맵 이미지 "), szBuf, sizeof(szBuf)); IMENUCTL_AddItem(pMe->m_pIMenu, 0, 0, MENU_EVT_BITBLT, szBuf, 0); STREXPAND((const unsigned char *)"3. 사각형 그리기 ", STRLEN("4. 사각형 그리기 "), szBuf, sizeof(szBuf)); IMENUCTL_AddItem(pMe->m_pIMenu, 0, 0, MENU_EVT_DRAWRECT, szBuf, 0); STREXPAND((const unsigned char *)"4. 버튼 생성하기 ", STRLEN("4. 버튼 생성하기 "), szBuf, sizeof(szBuf)); IMENUCTL_AddItem(pMe->m_pIMenu, 0, 0, MENU_EVT_FRAMEBUTTON, szBuf, 0); STREXPAND((const unsigned char *)"5. 프레임 그리기 ", STRLEN("5. 프레임 그리기 "), szBuf, sizeof(szBuf)); IMENUCTL_AddItem(pMe->m_pIMenu, 0, 0, MENU_EVT_DRAWFRAME, szBuf, 0); STREXPAND((const unsigned char *)"6. 선 그리기 ", STRLEN("6. 선 그리기 "), szBuf, sizeof(szBuf)); IMENUCTL_AddItem(pMe->m_pIMenu, 0, 0, MENU_EVT_DRAWLINE, szBuf, 0); IMENUCTL_SetActive(pMe->m_pIMenu,TRUE); return(TRUE); // 애플릿이 종료될 때 발생하는 이벤트이다. case EVT_APP_STOP: return(TRUE);

12 임베디드 모바일 프로그래밍 IDisplay API (2) case EVT_KEY: if (pMe->m_pIMenu) { if ((IMENUCTL_IsActive(pMe->m_pIMenu) == FALSE) && (wParam == AVK_RIGHT)) { pMe->m_nButton = 0; pMe->m_nFrame = 0; pMe->m_nDrawRect = 0; IMENUCTL_SetActive(pMe->m_pIMenu, TRUE); IMENUCTL_Redraw(pMe->m_pIMenu); } return IMENUCTL_HandleEvent(pMe->m_pIMenu, EVT_KEY, wParam, 0); } else return FALSE; case EVT_KEY_PRESS: { if((pMe->m_nButton == 1) && (wParam == AVK_SELECT)) { DisplayFrameButton(pMe, FALSE); } if((pMe->m_nDrawRect >= 2) && (wParam == AVK_SELECT)) { AEERect rct = {0}; RGBVAL clrFrame, clrFill; uint32 dwFlags; 키를 누를 경우 발 생하는 이벤트 메뉴 화면이 아닌 두 번째 화면에서 오른쪽 방향키를 누르면 메뉴 화면으로 돌아간다. 키 이벤트가 발 생할 때 발생하 는 이벤트이다. 자세한 키 정보 는 wParam 에 전 달

13 임베디드 모바일 프로그래밍 IDisplay API (2) switch(pMe->m_nDrawRect) { case 2: { SETAEERECT (&rct, 5, pMe- >m_nLineHeight*3 + 4, pMe->m_dInfo.cxScreen/2, pMe->m_nLineHeight); clrFrame = MAKE_RGB (0, 0, 0); // Black color clrFill = MAKE_RGB (0xff, 0xff, 0xff) ;// White color // Draw only the outline of the rectangle (rectangle frame). dwFlags = IDF_RECT_INVERT; pMe->m_nDrawRect += 1; IDISPLAY_DrawRect(pMe- >a.m_pIDisplay, &rct, clrFrame, clrFill, dwFlags); IDISPLAY_Update(pMe- >a.m_pIDisplay); break; } case 3: { SETAEERECT (&rct, 5, pMe- >m_nLineHeight*4 + 6, pMe->m_dInfo.cxScreen/2, pMe->m_nLineHeight); clrFrame = MAKE_RGB (0, 0xff, 0); // Green color 프레임 검정색의 흰 색 사각형을 반전하 여 그린다.

14 임베디드 모바일 프로그래밍 IDisplay API (2) clrFill = MAKE_RGB (0xff, 0, 0); // Red color dwFlags = IDF_RECT_FILL; pMe->m_nDrawRect += 1; IDISPLAY_DrawRect(pMe- >a.m_pIDisplay, &rct, clrFrame, clrFill, dwFlags); IDISPLAY_Update(pMe- >a.m_pIDisplay); break; } case 4: { SETAEERECT (&rct, 5, pMe- >m_nLineHeight*5 + 8, pMe->m_dInfo.cxScreen/2, pMe->m_nLineHeight); clrFrame = MAKE_RGB (0, 0, 0xff); // Blue color clrFill = MAKE_RGB (0, 0xff, 0); // Green color dwFlags = IDF_RECT_FRAME | IDF_RECT_FILL; pMe->m_nDrawRect += 1; IDISPLAY_DrawRect(pMe- >a.m_pIDisplay, &rct, clrFrame, clrFill, dwFlags); IDISPLAY_Update(pMe- >a.m_pIDisplay); break; }

15 임베디드 모바일 프로그래밍 IDisplay API (2) case 5: { SETAEERECT (&rct, 5, pMe- >m_nLineHeight*6 + 10, pMe->m_dInfo.cxScreen/2, pMe->m_nLineHeight); clrFrame = MAKE_RGB (0, 0, 0xff); // Blue color clrFill = MAKE_RGB (0, 0xff, 0); // Green color dwFlags = IDF_RECT_FRAME; pMe->m_nDrawRect += 1; IDISPLAY_DrawRect(pMe- >a.m_pIDisplay, &rct, clrFrame, clrFill, dwFlags); IDISPLAY_Update(pMe- >a.m_pIDisplay); break; } default: break; } if((pMe->m_nFrame >= 1) && (wParam == AVK_SELECT)) { AEERect rct; AEEFrameType fType; RGBVAL clrFill; 프레임 유형

16 임베디드 모바일 프로그래밍 IDisplay API (2) if(pMe->m_nFrame >=6) { SETAEERECT (&rct, 5, pMe- >m_nLineHeight*(2*(pMe->m_nFrame-5)+1), pMe->m_dInfo.cxScreen/2, pMe->m_nLineHeight); clrFill = MAKE_RGB (0, 0xff, 0); } else { SETAEERECT (&rct, 5, pMe- >m_nLineHeight*(2*pMe->m_nFrame+1), pMe->m_dInfo.cxScreen/2, pMe->m_nLineHeight); clrFill = MAKE_RGB (0, 0, 0xff); } switch(pMe->m_nFrame) { case 1: case 6: if(pMe->m_nFrame == 1) { DisplayOutput((IApplet *)pMe, 2*pMe->m_nFrame, "AEE_FT_3D_EMPTY", MAKE_RGB(0,0,0)); fType = AEE_FT_3D_EMPTY; } else { DisplayOutput((IApplet *)pMe, (pMe->m_nFrame-5)*2, "AEE..BOTTOM_SEL", MAKE_RGB(0,0,0)); fType = AEE_FT_TAB_BOTTOM_SEL; }

17 임베디드 모바일 프로그래밍 IDisplay API (2) IDISPLAY_DrawFrame (pMe- >a.m_pIDisplay, &rct, fType, clrFill); IDISPLAY_Update(pMe- >a.m_pIDisplay); pMe->m_nFrame += 1; break; case 2: case 7: if(pMe->m_nFrame == 2) { DisplayOutput((IApplet *)pMe, pMe->m_nFrame*2, "AEE_FT_RAISED", MAKE_RGB(0,0,0)); fType = AEE_FT_RAISED; } else { DisplayOutput((IApplet *)pMe, (pMe->m_nFrame-5)*2, "AEE..TAB_BOTTOM", MAKE_RGB(0,0,0)); fType = AEE_FT_TAB_BOTTOM; } IDISPLAY_DrawFrame (pMe- >a.m_pIDisplay, &rct, fType, clrFill); IDISPLAY_Update(pMe- >a.m_pIDisplay); pMe->m_nFrame += 1; break;

18 임베디드 모바일 프로그래밍 IDisplay API (2) case 3: case 8: if(pMe->m_nFrame == 3) { DisplayOutput((IApplet *)pMe, pMe->m_nFrame*2, "AEE_FT_LOWERED", MAKE_RGB(0,0,0)); fType = AEE_FT_LOWERED; } else { DisplayOutput((IApplet *)pMe, (pMe->m_nFrame-5)*2, "AEE_FT_TAB_TOP", MAKE_RGB(0,0,0)); fType = AEE_FT_TAB_TOP; } IDISPLAY_DrawFrame (pMe- >a.m_pIDisplay, &rct, fType, clrFill); IDISPLAY_Update(pMe- >a.m_pIDisplay); pMe->m_nFrame += 1; break; case 4: case 9: if(pMe->m_nFrame == 4) { DisplayOutput((IApplet *)pMe, pMe->m_nFrame*2, "AEE_FT_BOX", MAKE_RGB(0,0,0)); fType = AEE_FT_BOX; }

19 임베디드 모바일 프로그래밍 IDisplay API (2) else { DisplayOutput((IApplet *)pMe, (pMe->m_nFrame-5)*2, "AEE_FT_TAB_TOP_SEL", MAKE_RGB(0,0,0)); fType = AEE_FT_TAB_TOP_SEL; IDISPLAY_EraseRgn (pMe->a.m_pIDisplay, 0, pMe->m_nLineHeight*10, pMe- >m_dInfo.cxScreen, pMe->m_dInfo.cyScreen); } IDISPLAY_DrawFrame (pMe- >a.m_pIDisplay, &rct, fType, clrFill); IDISPLAY_Update(pMe- >a.m_pIDisplay); pMe->m_nFrame += 1; break; case 5: DisplayOutput((IApplet *)pMe, pMe->m_nFrame*2, "AEE_FT_INDENT", MAKE_RGB(0,0,0)); fType = AEE_FT_INDENT; IDISPLAY_DrawFrame (pMe- >a.m_pIDisplay, &rct, fType, clrFill); IDISPLAY_Update(pMe- >a.m_pIDisplay); pMe->m_nFrame += 1; break; default: break; }

20 임베디드 모바일 프로그래밍 IDisplay API (2) if((pMe->m_nDrawLine >= 1) && (wParam == AVK_SELECT)) { int16 startX = 10; int16 startY = pMe->m_dInfo.cyScreen/4; int16 len = pMe->m_dInfo.cxScreen/2; switch(pMe->m_nDrawLine) { case 1: IDISPLAY_DrawHLine(pMe- >a.m_pIDisplay, startX, startY, len); break; case 2: IDISPLAY_DrawVLine(pMe- >a.m_pIDisplay, startX, startY, len); break; case 3: IDISPLAY_DrawHLine(pMe- >a.m_pIDisplay, startX, startY+len, len); break; case 4: IDISPLAY_DrawVLine(pMe- >a.m_pIDisplay, startX + len, startY, len); break; default: break; } pMe->m_nDrawLine += 1; IDISPLAY_Update(pMe->a.m_pIDisplay); //DisplayFrameButton(pMe, FALSE); } return TRUE; }

21 임베디드 모바일 프로그래밍 IDisplay API (2) case EVT_KEY_RELEASE: { if((pMe->m_nButton == 1) && (wParam == AVK_SELECT)) { DisplayFrameButton(pMe, TRUE); } return TRUE; } 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(0x66,0x33,0)); DisplayOutput((IApplet *)pMe, 4, " 헤아릴 수 없는 ", MAKE_RGB(0x66,0xff,0)); DisplayOutput((IApplet *)pMe, 6, " 사연을 간직한 ", MAKE_RGB(0x66,0x66,0)); DisplayOutput((IApplet *)pMe, 8, " 시간의 파편들이여 !", MAKE_RGB(0x99,0x33,0x33)); return TRUE; }

22 임베디드 모바일 프로그래밍 IDisplay API (2) case MENU_EVT_BITBLT: { AEEBmp pbmSource; int xDest = 0; int yDest = 10; int cxDest = pMe->m_dInfo.cxScreen; int cyDest = pMe->m_dInfo.cyScreen; int xSrc = 0; int ySrc = 0; AEERasterOp dwRopCode = AEE_RO_MASK; AEEImageInfo imageInfo; void *pBmp = NULL, *pDataBytes = NULL; boolean bVal = TRUE; IDISPLAY_ClearScreen (pMe->a.m_pIDisplay); IMENUCTL_SetProperties(pMe->m_pIMenu, MP_NO_REDRAW); IMENUCTL_SetActive(pMe->m_pIMenu, FALSE); pbmSource = ISHELL_LoadResData (pMe->a.m_pIShell, APP_RES_FILE, IDB_BITMAP_CU, RESTYPE_IMAGE); pDataBytes = (byte *)pbmSource + *((byte *)pbmSource); pBmp = CONVERTBMP (pDataBytes, &imageInfo, &bVal);

23 임베디드 모바일 프로그래밍 IDisplay API (2) IDISPLAY_BitBlt (pMe->a.m_pIDisplay, xDest, yDest, cxDest, cyDest, pBmp, xSrc, ySrc, dwRopCode); IDISPLAY_Update (pMe->a.m_pIDisplay); ISHELL_FreeResData (pMe->a.m_pIShell, pbmSource); if(bVal)//free only if realloc was done SYSFREE ( pBmp); return TRUE; } case MENU_EVT_FRAMEBUTTON: { 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(0,0,0)); DisplayOutput((IApplet *)pMe, 8, " 이전 메뉴는 오른쪽 키 를 선택하세요.", MAKE_RGB(0,0,0)); DisplayFrameButton(pMe, TRUE); pMe->m_nButton = 1; return TRUE; }

24 임베디드 모바일 프로그래밍 IDisplay API (2) case MENU_EVT_DRAWRECT: { IDISPLAY_ClearScreen (pMe->a.m_pIDisplay); IMENUCTL_SetProperties(pMe->m_pIMenu, MP_NO_REDRAW); IMENUCTL_SetActive(pMe->m_pIMenu, FALSE); DisplayOutput((IApplet *)pMe, 1, "DrawRect 함수 ", MAKE_RGB(0,0,0)); pMe->m_nDrawRect = 2; return TRUE; } case MENU_EVT_DRAWFRAME: { IDISPLAY_ClearScreen (pMe->a.m_pIDisplay); IMENUCTL_SetProperties(pMe->m_pIMenu, MP_NO_REDRAW); IMENUCTL_SetActive(pMe->m_pIMenu, FALSE); DisplayOutput((IApplet *)pMe, 1, "DrawFrame 함수 ", MAKE_RGB(0,0,0)); IDISPLAY_Update(pMe->a.m_pIDisplay); pMe->m_nFrame = 1; return TRUE; } 사각형 그리기 화면

25 임베디드 모바일 프로그래밍 IDisplay API (2) case MENU_EVT_DRAWLINE: { 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(0,0,0)); IDISPLAY_Update(pMe->a.m_pIDisplay); pMe->m_nDrawLine = 1; return TRUE; } default: return FALSE; } default: break; } return FALSE; }

26 임베디드 모바일 프로그래밍 IDisplay API (2) static boolean IDisplayEx2_InitAppData(IApplet* pi) { CIDisplayEx2* pMe = (CIDisplayEx2*)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 IDisplayEx2_FreeAppData(IApplet* pi) { CIDisplayEx2* pMe = (CIDisplayEx2*)pi; // 메뉴 컨트롤이 해지가 되지 않았다면 해지한다. if (pMe->m_pIMenu != NULL) { // 메뉴 컨트롤 해지하는 함수 IMENUCTL_Release (pMe->m_pIMenu); pMe->m_pIMenu = NULL; }

27 임베디드 모바일 프로그래밍 IDisplay API (2) static void DisplayFrameButton(CIDisplayEx2 *pMe, boolean buttonType) { AEERect rct; AEEFrameType fType; RGBVAL clrFill; SETAEERECT (&rct, pMe->m_dInfo.cxScreen/4, pMe->m_nLineHeight*3, pMe->m_dInfo.cxScreen/3, pMe- >m_nLineHeight*3/2); fType = AEE_FT_EMPTY; clrFill = MAKE_RGB (0, 0, 0xff); IDISPLAY_FrameButton (pMe->a.m_pIDisplay, &rct, buttonType, clrFill); IDISPLAY_Update (pMe->a.m_pIDisplay); } 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;

28 임베디드 모바일 프로그래밍 IDisplay API (2) 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); // Convert to wide string (unicode) 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);

29 임베디드 모바일 프로그래밍 IDisplay API (2) 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); 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; }

30 임베디드 모바일 프로그래밍 IDisplay API (2) 11.3 실행 결과

31 임베디드 모바일 프로그래밍 IDisplay API (2)

32 임베디드 모바일 프로그래밍 IDisplay API (2) 11.4 박테리아 프로그램  bacteria.h #include "AEEModGen.h" #include "AEEAppGen.h" #include "AEEShell.h" #include "AEEGraphics.h" #include "AEEStdLib.h" #include "bacteria.bid" #define STARTX 15 #define STARTY 10 #define BLOCKSIZE 10 #define NONE 100 #define RED 101 #define BLUE 102 #define REDMAN 200 #define BLUEMAN 201 #define LEFT 300 #define RIGHT 301 #define UP 302 #define DOWN 303 typedef struct _bacteria { AEEApplet a ; AEEDeviceInfo DeviceInfo; IDisplay *pIDisplay; IShell *pIShell;

33 임베디드 모바일 프로그래밍 IDisplay API (2) IGraphics *graphic; int bgArry[10][10]; AEECircle block; AEERect pointer; int gameState; int gameOrder; int direction; RGBVAL nowColor; int indexX, indexY; } bacteria; static boolean bacteria_HandleEvent(bacteria* pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam); boolean bacteria_InitAppData(bacteria* pMe); void bacteria_FreeAppData(bacteria* pMe); void drawBG(bacteria *pMe); void startGame(bacteria *pMe); void selectBlock(bacteria *pMe); void move(bacteria *pMe); void checkLine(bacteria *pMe);

34 임베디드 모바일 프로그래밍 IDisplay API (2)  bacteria.c #include "bacteria.h" int AEEClsCreateInstance(AEECLSID ClsId, IShell *pIShell, IModule *po, void **ppObj) { *ppObj = NULL; if( ClsId == AEECLSID_BACTERIA ) { if( AEEApplet_New(sizeof(bacteria), ClsId, pIShell, po, (IApplet**)ppObj, (AEEHANDLER)bacteria_HandleEvent, (PFNFREEAPPDATA)bacteria_FreeAppData)) { if(bacteria_InitAppData((bacteria*)*ppObj)) { return(AEE_SUCCESS); } else { IAPPLET_Release((IApplet*)*ppObj); return EFAILED; } return(EFAILED); } static boolean bacteria_HandleEvent(bacteria* pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam) { switch (eCode) {

35 임베디드 모바일 프로그래밍 IDisplay API (2) case EVT_APP_START: if(pMe->gameState == 0) { pMe->gameState=1; drawBG(pMe); } return(TRUE); case EVT_APP_STOP: return(TRUE); case EVT_APP_SUSPEND: return(TRUE); case EVT_APP_RESUME: return(TRUE); case EVT_APP_MESSAGE: return(TRUE); case EVT_KEY: switch(wParam) { case AVK_SELECT: if(pMe->gameState == 1) { pMe->gameState = 2; startGame(pMe); } else if(pMe->gameState == 2 && pMe->bgArry[pMe->indexY][pMe- >indexX]== NONE){ selectBlock(pMe); } break; case AVK_LEFT: if(pMe->indexX > 0 && pMe->gameState==2) { SETAEERECT(&pMe->pointer, STARTX+pMe- >indexX*10+3, STARTY+pMe->indexY*10+3, BLOCKSIZE-6, BLOCKSIZE-6); IDISPLAY_DrawRect(pMe->pIDisplay, &pMe->pointer, MAKE_RGB(255,255,255), MAKE_RGB(255,255,255), IDF_RECT_FRAME|IDF_RECT_FILL); pMe->indexX--; move(pMe); IDISPLAY_Update(pMe->pIDisplay); } break;

36 임베디드 모바일 프로그래밍 IDisplay API (2) case AVK_RIGHT: if(pMe->indexX gameState==2) { SETAEERECT(&pMe->pointer, STARTX+pMe- >indexX*10+3, STARTY+pMe->indexY*10+3, BLOCKSIZE-6, BLOCKSIZE-6); IDISPLAY_DrawRect(pMe->pIDisplay, &pMe->pointer, MAKE_RGB(255,255,255), MAKE_RGB(255,255,255), IDF_RECT_FRAME|IDF_RECT_FILL); pMe->indexX++; move(pMe); IDISPLAY_Update(pMe->pIDisplay); } break; case AVK_UP: if(pMe->indexY > 0 && pMe->gameState==2) { SETAEERECT(&pMe->pointer, STARTX+pMe- >indexX*10+3, STARTY+pMe->indexY*10+3, BLOCKSIZE-6, BLOCKSIZE-6); IDISPLAY_DrawRect(pMe->pIDisplay, &pMe->pointer, MAKE_RGB(255,255,255), MAKE_RGB(255,255,255), IDF_RECT_FRAME|IDF_RECT_FILL); pMe->indexY--; move(pMe); IDISPLAY_Update(pMe->pIDisplay); } break; case AVK_DOWN: if(pMe->indexY gameState==2) { SETAEERECT(&pMe->pointer, STARTX+pMe- >indexX*10+3, STARTY+pMe->indexY*10+3, BLOCKSIZE-6, BLOCKSIZE-6); IDISPLAY_DrawRect(pMe->pIDisplay, &pMe->pointer, MAKE_RGB(255,255,255), MAKE_RGB(255,255,255), IDF_RECT_FRAME|IDF_RECT_FILL); pMe->indexY++; move(pMe); IDISPLAY_Update(pMe->pIDisplay); } break; } return(TRUE); default: break; } return FALSE; }

37 임베디드 모바일 프로그래밍 IDisplay API (2) boolean bacteria_InitAppData(bacteria* pMe) { pMe->DeviceInfo.wStructSize = sizeof(pMe->DeviceInfo); ISHELL_GetDeviceInfo(pMe->a.m_pIShell,&pMe->DeviceInfo); pMe->pIDisplay = pMe->a.m_pIDisplay; pMe->pIShell = pMe->a.m_pIShell; return TRUE; } void bacteria_FreeAppData(bacteria* pMe) { } void drawBG(bacteria *pMe) { int i, j; AEERect bgRect; for(i=0 ; i < 10 ; i++) { for(j=0 ; j < 10 ; j++) { SETAEERECT(&bgRect, STARTX + i*BLOCKSIZE, STARTY + j*BLOCKSIZE, BLOCKSIZE, BLOCKSIZE); IDISPLAY_DrawRect(pMe->pIDisplay, &bgRect, MAKE_RGB(0,0,0), MAKE_RGB(255,255,255), IDF_RECT_FRAME ); } IDISPLAY_Update(pMe->pIDisplay); } void startGame(bacteria *pMe) { int i,j; ISHELL_CreateInstance(pMe->pIShell, AEECLSID_GRAPHICS, (void**)&pMe->graphic); pMe->gameOrder = REDMAN; for(i=0 ; i<10 ; i++) { for(j=0 ; j<10; j++) { pMe->bgArry[i][j] = NONE; }

38 임베디드 모바일 프로그래밍 IDisplay API (2) pMe->indexX = 0; pMe->indexY = 0; pMe->nowColor = MAKE_RGB(255,0,0); SETAEERECT(&pMe->pointer, STARTX+3, STARTY+3, BLOCKSIZE-6, BLOCKSIZE-6); IDISPLAY_DrawRect(pMe->pIDisplay, &pMe->pointer, pMe->nowColor, pMe->nowColor, IDF_RECT_FRAME|IDF_RECT_FILL); IDISPLAY_Update(pMe->pIDisplay); } void selectBlock(bacteria *pMe) { if(pMe->gameOrder == REDMAN) { pMe->gameOrder = BLUEMAN; pMe->bgArry[pMe->indexY][pMe->indexX] = RED; pMe->nowColor = MAKE_RGB(0,0,255); checkLine(pMe); move(pMe); IDISPLAY_Update(pMe->pIDisplay); } else if(pMe->gameOrder == BLUEMAN) { pMe->gameOrder = REDMAN; pMe->bgArry[pMe->indexY][pMe->indexX] = BLUE; pMe->nowColor = MAKE_RGB(255,0,0); checkLine(pMe); move(pMe); IDISPLAY_Update(pMe->pIDisplay); } void move(bacteria *pMe) { int i,j; for(i=0 ; i<10 ; i++) { for(j=0 ; j<10 ; j++) {

39 임베디드 모바일 프로그래밍 39 pMe->block.cx = STARTX+j*10+BLOCKSIZE/2; pMe->block.cy = STARTY+i*10+BLOCKSIZE/2; pMe->block.r = BLOCKSIZE/2; switch(pMe->bgArry[i][j]) { case NONE: break; case RED: IGRAPHICS_SetFillMode(pMe->graphic, TRUE); IGRAPHICS_SetFillColor(pMe->graphic, 255,0,0,0); IGRAPHICS_DrawCircle(pMe->graphic, &pMe->block); break; case BLUE: IGRAPHICS_SetFillMode(pMe->graphic, TRUE); IGRAPHICS_SetFillColor(pMe->graphic, 0,0,255,0); IGRAPHICS_DrawCircle(pMe->graphic, &pMe->block); break; } SETAEERECT(&pMe->pointer, STARTX+pMe->indexX*10+3, STARTY+pMe->indexY*10+3, BLOCKSIZE-6, BLOCKSIZE-6); IDISPLAY_DrawRect(pMe->pIDisplay, &pMe->pointer, pMe->nowColor, pMe->nowColor, IDF_RECT_FRAME|IDF_RECT_FILL); } void checkLine(bacteria *pMe) { int i,j, x,y; int tempX, tempY, NoneCount=0; tempX = pMe->indexX; tempY = pMe->indexY; 11. IDisplay API (2)

40 임베디드 모바일 프로그래밍 40 for(i = tempX ; i < 9 ; i++) { if(pMe->bgArry[tempY][i+1]==NONE) break; else if(pMe->bgArry[tempY][i+1] == pMe->bgArry[pMe->indexY][pMe->indexX]) { for(j=tempX ; j<=i ; j++) { pMe->bgArry[tempY][j] = pMe->bgArry[pMe->indexY][pMe->indexX]; } break; } for(i = tempX ; i >= 0 ; i--) { if(pMe->bgArry[tempY][i-1]==NONE) break; else if(pMe->bgArry[tempY][i-1] == pMe->bgArry[pMe->indexY][pMe->indexX]) { for(j=tempX ; j>=i ; j--) { pMe->bgArry[tempY][j] = pMe->bgArry[pMe->indexY][pMe->indexX]; } break; } for(i = tempY ; i < 9 ; i++) { if(pMe->bgArry[i+1][tempX]==NONE) break; else if(pMe->bgArry[i+1][tempX] == pMe->bgArry[pMe->indexY][pMe->indexX]) { for(j=tempY ; j<=i ; j++) { pMe->bgArry[j][tempX] = pMe->bgArry[pMe->indexY][pMe->indexX]; } break; } 11. IDisplay API (2)

41 임베디드 모바일 프로그래밍 41 for(i = tempY ; i >= 0 ; i--) { if(pMe->bgArry[i-1][tempX]==NONE) break; else if(pMe->bgArry[i-1][tempX] == pMe->bgArry[pMe->indexY][pMe->indexX]) { for(j=tempY ; j>=i ; j--) { pMe->bgArry[j][tempX] = pMe->bgArry[pMe->indexY][pMe- >indexX]; } break; } for(i = tempX, j = tempY; i<9 && j<9; i++, j++) { if(pMe->bgArry[j+1][i+1]==NONE) break; else if(pMe->bgArry[j+1][i+1] == pMe->bgArry[pMe->indexY][pMe->indexX]) { for(x=tempX, y=tempY ; x<=i && y<=j ; x++,y++) { pMe->bgArry[y][x] = pMe->bgArry[pMe->indexY][pMe->indexX]; } break; } for(i = tempX, j = tempY; i =0; i++, j--) { if(pMe->bgArry[j-1][i+1]==NONE) break; else if(pMe->bgArry[j-1][i+1] == pMe->bgArry[pMe->indexY][pMe->indexX]) { for(x=tempX, y=tempY ; x =j ; x++,y--) { pMe->bgArry[y][x] = pMe->bgArry[pMe->indexY][pMe->indexX]; } break; } 11. IDisplay API (2)

42 임베디드 모바일 프로그래밍 42 for(i = tempX, j = tempY; i>=0 && j>=0; i--, j--) { if(pMe->bgArry[j-1][i-1]==NONE) break; else if(pMe->bgArry[j-1][i-1] == pMe->bgArry[pMe->indexY][pMe->indexX]) { for(x=tempX, y=tempY ; x>=i && y>=j ; x--,y--) { pMe->bgArry[y][x] = pMe->bgArry[pMe->indexY][pMe->indexX]; } break; } for(i = tempX, j = tempY; i>=0 && j<9; i--, j++) { if(pMe->bgArry[j+1][i-1]==NONE) break; else if(pMe->bgArry[j+1][i-1] == pMe->bgArry[pMe->indexY][pMe->indexX]) { for(x=tempX, y=tempY ; x>=i && y<=j ; x--,y++) { pMe->bgArry[y][x] = pMe->bgArry[pMe->indexY][pMe->indexX]; } break; } 11. IDisplay API (2)

43 임베디드 모바일 프로그래밍 IDisplay API (2) 14.5 박테리아 프로그램 실행 결과


Download ppt "임베디드 모바일 프로그래밍 1 11. IDisplay API (2) 11.1 IDisplay API 서비스 – 간단한 도형 그리기 IDISPLAY_DrawRect 함수 - 지정한 색과 플래그를 사용하여 주어진 사각형을 그리는 함수 - IDISPLAY_DrawRect 함수의."

Similar presentations


Ads by Google