임베디드 모바일 프로그래밍 1 11. idisplay api (2) 11.1 idisplay api 서비스 –...
TRANSCRIPT
임베디드 모바일 프로그래밍 1
11. IDisplay API (2)
11.1 IDisplay API 서비스 – 간단한 도형 그리기
• IDISPLAY_DrawRect 함수
- 지정한 색과 플래그를 사용하여 주어진 사각형을 그리는 함수
- IDISPLAY_DrawRect 함수의 형식
함수 형식Void IDISPLAY_DrawRect(Idisplay *pIDisplay, const AEERect *pRect, RGBVAL clrFrame, RGBVAL clrFi
ll, uint32 dwFlags)
기 능 지정한 색과 플래그를 사용하여 여러가지 모양의 사각형을 그리는 함수
함수 인자
pIDisplay IDisplay 인터페이스 포인터
pRect 사각형이 표현될 좌표를 지정한다 .
clrFrame 프레임의 색을 지정한다 .
clrFill 사각형을 채울 색을 지정한다 .
dwFlags 플래그 값 , IDF_RECT_FRAME, IDF_RECT_FILL, IDF_RECT_INVERT
반환값 없음
임베디드 모바일 프로그래밍 2
11. 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
11. IDisplay API (2)
• IDISPLAY_DrawFrame 함수
- 시스템의 색 해상도에 따라 복잡한 프레임을 그리는 함수
- IDISPLAY_DrawFrame 함수의 형식
함수 형식
Int IDISPLAY_DrawFrame(IDisplay * pIDisplay, AEERect * prc, AEEFrameType ft, RGBVAL clrFill)
기 능 프레임을 생성하기 위하여 사용하며 채우기 색상을 지정할 수 있다 .
함수 인자
pIDisplay IDisplay 인터페이스 포인터
prc 프레임을 나타낼 좌표를 지정한다 .
ft 프레임의 유형을 나타낸다 .
clrFill 채우기에 사용되는 색상 정보반환값 없음
임베디드 모바일 프로그래밍 4
11. 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
11. 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
11. 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_FRAMEBUTTON
MENU_EVT_DRAWRECT
• ISHELL_LoadResData();• IDISPLAY_BitBlt();• IDISPLAY_Update()
MENU_EVT_DISPLAY
MENU_EVT_DRAWFRAME
MENU_EVT_DRAWLINE
임베디드 모바일 프로그래밍 7
11. 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_DISPLAY 401
#define MENU_EVT_BITBLT 402
#define MENU_EVT_FRAMEBUTTON 403
#define MENU_EVT_DRAWRECT 404
#define MENU_EVT_DRAWFRAME 405
#define MENU_EVT_DRAWLINE 406
#define APP_RES_FILE "IDisplayEx2.bar"
임베디드 모바일 프로그래밍 8
11. IDisplay API (2)typedef struct _CIDisplayEx2
{
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;
} 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
11. 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
11. 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_SCROLL
BAR|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
11. IDisplay API (2)STREXPAND((const unsigned char *)"1. 텍스트 처리 ", STRLEN("1. 텍스트 처리 "), s
zBuf, 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
11. 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
11. 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
11. 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
11. 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
11. 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
11. 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
11. 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
11. 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
11. 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
11. 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_RE
DRAW);IMENUCTL_SetActive(pMe->m_pIMenu, FALSE);DisplayOutput((IApplet *)pMe, 1, " 낙엽들을 보며 ", MAK
E_RGB(0x66,0x33,0));DisplayOutput((IApplet *)pMe, 4, " 헤아릴 수 없는 ", MAK
E_RGB(0x66,0xff,0));DisplayOutput((IApplet *)pMe, 6, " 사연을 간직한 ", MAK
E_RGB(0x66,0x66,0));DisplayOutput((IApplet *)pMe, 8, " 시간의 파편들이여 !",
MAKE_RGB(0x99,0x33,0x33));return TRUE;
}
임베디드 모바일 프로그래밍 22
11. 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
11. IDisplay API (2)IDISPLAY_BitBlt (pMe->a.m_pIDisplay, xDest, yDest, cxD
est, 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
11. 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
11. 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
11. IDisplay API (2)static boolean IDisplayEx2_InitAppData(IApplet* pi){
CIDisplayEx2* pMe = (CIDisplayEx2*)pi;int pnAscent = 0;int pnDescent = 0;// Initialize the MenuCtl pointer to NULLpMe->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
11. 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
11. 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
11. 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
11. IDisplay API (2)
11.3 실행 결과
임베디드 모바일 프로그래밍 31
11. IDisplay API (2)
임베디드 모바일 프로그래밍 32
11. 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
11. 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
11. 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
11. 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->inde
xX]== 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
11. IDisplay API (2)case AVK_RIGHT:
if(pMe->indexX < 9 && 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;
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 < 9 && 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;
} return(TRUE); default: break; } return FALSE;}
임베디드 모바일 프로그래밍 37
11. 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
11. 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|ID
F_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
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 , B
LOCKSIZE-6);IDISPLAY_DrawRect(pMe->pIDisplay , &pMe->pointer , pMe->nowColor , pMe->nowColor , IDF_RECT_FRAME|ID
F_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
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
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<9 && 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;
}}
11. IDisplay API (2)
임베디드 모바일 프로그래밍 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
11. IDisplay API (2)
14.5 박테리아 프로그램 실행 결과