본 장에서는 프로젝트를 생성하고 코드를 입력하기 위한 준비작업은 생략했다. 본 강좌의 2, 3장을 참조하기 바란다. 새로운 프로젝트명은 HelloIMAGE 로 할 것이며, 새로운 애플릿의 ClassID는 0x02000004로 지정했다.
또한 HelloIMAGE의 전체 소스를 첨부할 것이므로 프로젝트 생성이 어려운 독자는 참조하시기 바란다.
HelloIMAGE 프로젝트
압축을 해제하고 생성된 디렉토리를 brew 애플릿 디렉토리로 복사하도록 하자. 이제 mif 편집기를 실행해서 mif 정보를 등록하도록 하자. 기존에 mif 파일을 생성할 때와 지금의 작업에서 틀린 점은 기존에 생성되어 있는 bid 파일을 사용한다는 점이다. mif 편집기를 실행하고 중간에 있는 .BID 파일 찾아보기 버튼을 클릭하도록 하자.
|
<그림 2_1 BID 파일 찾아보기>
|
BID 파일은 첨부한 소스 디렉토리에 들어 있다. 나머지의 작업은 새로운 애플릿을 생성하는 것과 다르지 않으므로 하던대로 하면 된다. 단 여기서도 mif 파일은 애플릿 디렉토리에 저장하는 것을 잊지 말도록 하자.
<소스파일 : HelloIMAGE.c>
1 #include "AEEModGen.h"
2 #include "AEEAppGen.h"
3 #include "AEEDisp.h"
4 #include "HelloIMAGE.bid"
5 #include "HelloIMAGE_res.h"
6
7 #define APP_RES_FILE "HelloIMAGE.bar" // Resource file name
8
9 static boolean HelloIMAGE_HandleEvent(IApplet * pi, AEEEvent eCode,
10 uint16 wParam, uint32 dwParam);
11
12 int AEEClsCreateInstance(AEECLSID ClsId, IShell * pIShell,
13 IModule * po, void ** ppObj)
14 {
15 *ppObj = NULL;
16
17 if(ClsId == AEECLSID_HELLOIMAGE){
18 if(AEEApplet_New(sizeof(AEEApplet), ClsId, pIShell, po,
19 (IApplet**)ppObj, (AEEHANDLER)HelloIMAGE_HandleEvent,
20 NULL) == TRUE)
21 {
22 return(AEE_SUCCESS);
23 }
24 }
25 return (EFAILED);
26 }
27
28 static boolean HelloIMAGE_HandleEvent(IApplet * pi, AEEEvent eCode,
29 uint16 wParam, uint32 dwParam)
30 {
31 AEEDeviceInfo di;
32 AEEApplet * pMe = (AEEApplet *)pi;
33 IImage * pIImage = NULL; // IImage interface pointer
34 AEEImageInfo ii; // 이미지의 정보를 저장할 공간
35 int cxWidth, cyHeight, nCursorX, nCursorY;
36
37 switch (eCode)
38 {
39 case EVT_APP_START: // 애플릿 시작 이벤트
40 // 장치에 대한 핸들을 얻는다.
41 ISHELL_GetDeviceInfo (pMe->m_pIShell, &di);
42 // 장치의 사이즈를 구한다.
43 cxWidth = di.cxScreen;
44 cyHeight = di.cyScreen;
45 // 화면을 지운다.
46 IDISPLAY_ClearScreen (pMe->m_pIDisplay);
47 // 리소스 파일로부터 이미지를 읽는다.
48 if ((pIImage = ISHELL_LoadResImage(pMe->m_pIShell, APP_RES_FILE,
49 IDI_IMAGE)) == NULL)
50 {
51 return FALSE;
52 }
53 // 이미지의 정보를 가져온다
54 IIMAGE_GetInfo (pIImage, &ii);
55 // 이미지를 출력할 위치를 계산한다.(중앙)
56 nCursorX = (cxWidth - (int)ii.cx) / 2;
57 nCursorY = (cyHeight - (int)ii.cy) / 2;
58 // 리소스에서 읽은 이미지를 출력한다.
59 IIMAGE_Draw (pIImage, nCursorX, nCursorY);
60 // 화면을 갱신한다.
61 IDISPLAY_Update (pMe->m_pIDisplay);
62 // 사용한 리소스를 해제한다.
63 if(pIImage != NULL)
64 {
65 IIMAGE_Release(pIImage);
66 }
67 return (TRUE);
68 case EVT_APP_STOP:
69 return TRUE;
70 default:
71 break;
72 }
73 return FALSE;
74 } |
이 소스 코드도 전에 작성했던 HelloBREW 나 HelloKOREAN과 전혀 다르지 않다. 다만 글씨가 써질 부분에 이미지를 출력했다는 것만 틀릴 뿐이다.
5행과 7행을 보면 리소스 편집기에서 빌드한 bar 파일과 헤더 파일을 포함시킨다. 12~26행에서 애플릿으로 진입하는 시작점이 진행된다.
28행부터가 각종 이벤트를 처리하는 부분이다. 특히 39~67행까지가 리소스를 준비하고 출력하고 해제하는 부분이 들어있다.
48행은 포함시킨 리소스파일로부터 IDI_IMAGE라는 이미지 리소스를 읽어들인다.
54행은 56~57행에서 이미지 출력 위치를 계산하기 위해서 이미지 정보를 읽는 작업이다.
63~66행에서는 사용한 리소스를 해제하는 작업을 한다. 이 부분은 다른 윈도우 프로그램에서와 마찬가지로 대단히 중요한 부분 중의 하나이다. 보통 윈도우 프로그램에서 리소스를 적절하게 관리하는 것은 전체 시스템의 안정화를 위해서 대단히 중요한 부분이라고 한다. 하물며 모바일 프로그램에서는 일반 PC보다 더욱 제한된 리소스를 활용할 수밖에 없으므로 그 중요성은 강조할 필요조차 없다.
이제 실행을 시켜보도록 하자. 다음의 화면과 같이 나오면 정상적으로 실행이 된 것이다.
|
<그림 2_2 비트맵 이미지를 출력한 모습> | |
첫댓글 좋은 게시물이네요. 스크랩 해갈게요~^^
좋은 게시물이네요. 스크랩 해갈게요~^^