Eungene's Imaginations...

Clet_01 HelloWorld 출력 본문

Programming/WIPI Clet

Clet_01 HelloWorld 출력

Eungene's 2007. 10. 11. 00:22
728x90
반응형
사용자 삽입 이미지
 

우리가 기존에 저장했던 HelloWorld Project이다.

===============================================================

만약, 기존에 창을 끄고 다시 VC6.0을 실행한 거라면, [File] --> [Open Workspace]를 눌러, 우리가 저장했던, HelloWorld Folder 안에 확장자가 dsw파일인 것을 선택해서열면 위와 같은 그림과 같이 나온다.

===============================================================

우리가 여기서 확인해야 할 것이.

위 그림에서 아래빨간박스처럼 FileView가 선택이 되어 있는지 확인한 후, 위의 빨간 박스와 같이 나오는지 확인을 하기 바란다.


그럼 이제 우리가 본격적으로 Clet을 다루기 시작할 텐데, Clet을 코딩하려면, 코딩할 수 있도록 c파일을 생성을 해줘야 한다.

[File] --> [New] 메뉴를 눌러주면,

사용자 삽입 이미지

위 그림과 같이 창이 뜰 것이다.
그럼 우리는 가장 먼저 [Files]탭이 선택이 되어 있는지 확인 후,
두 번째로, 2번 네모 박스와 같이 [C++ Source File]을 선택한다.
세 번째로, [Add to project]에 첵크가 되어 있는지 확인후,
네 번째로, 4번 박스와 같이 [File]에디트 박스에 <HelloWorld.c>라고 입력을 해 준다.


중요한 것은 기존에 우리가 CAPI를 다루었던 사람들이라면, 무의식적으로 cpp라는 확장명을 적어줄것이다. 아니면, ‘.c'라는 확장자는 신경도 안쓸것이다. 하지만, 여기서 확장자를 안 붙여주게 되면, 기본적으로 c++파일로 인식을 하게 되고, 우리가 제대로 소스를 짰음에도 불구하고, WIPI Emulator에서는 안돌아가는 경우도 있을 것이다. 그 점을 유의하고, File명에는 뒤에 반드시 ’.c'를 붙여주도록 하자.


위에서 모두 똑같이 했으면, [OK]버튼을 눌러준다.


사용자 삽입 이미지


 

그럼 위의 그림처럼 빨간 박스에 나와있듯이 [Source Files]라는 폴더에 파일이 생겼다는 표시가 뜰 것이고, 기존에 위에서 보았던 회색바탕과는 달리 샤방샤방한 하얀색 에디트 박스가 생긴것을 확인할 수 있다. 우리는 이 에디트 박스에 직접 소스코딩을 하면 된다.

그럼 다음과 같이 코딩을 해 보기 바란다. 

===========================================

#include "WIPIHeader.h"


MC_GrpContext cxt;

MC_GrpFrameBuffer bpl;


void startClet(int argc, char* args[])

{

        MC_knlPrintk("this is My First Program 'Hello WiPI'\n");

        MC_knlPrintk("start Clet!!\n");

        bpl = MC_grpGetScreenFrameBuffer(0);


        MC_grpInitContext(&cxt);

}


void pauseClet()

{

}


void destroyClet()

{

}


void resumeClet()

{

}


void paintClet(int x, int y, int w, int h)

{

        M_Int32 height;

        height = MC_GRP_GET_FRAME_BUFFER_HEIGHT(bpl);

        MC_grpDrawString(bpl, 0, height/2, "Hello WIPI", -1, &cxt);

}


void handleCletEvent(int type, int parm1, int parm2)

{

}
===========================================



 

위와 같이 코딩을 했다면, [F7]키를 눌러서 Compile을 해보도록 하자.

만약, Compile하는 것이 너무나 단순해서 싫다면, [Build] 메뉴의 첫 번째 메뉴인 [Compile]을 눌러서 컴파일을 해보기 바란다. 

--------------------Configuration: HelloWorld - Win32 Debug---------------

Linking...

   Creating library Debug/HelloWorld.lib and object Debug/HelloWorld.exp

LINK : warning LNK4098: defaultlib "LIBCMTD" conflicts with use of other libs; use /NODEFAULTLIB:library


HelloWorld.dll - 0 error(s), 1 warning(s)

-----------------------------------------------------------------------

만약 위와 같은 warning이 떳다면, 걱정할 필요가 없다. 나중에 VC를 쓰다보면 알겠지만, Default library File이 아닌 걸 썼기 때문에 출력된 것이라고만 우선 알고 있자.


========================================================================

TIP : 
만약 아래와 같은 에러가 떴다면, 우리가 [Project] --> [Settings] 메뉴에서 WIPIstub.obj파일을 추가 안 해주었기 때문에 나오는 것이다. WIPIstub 파일을 추가시켜주려면, 1장에 자세히 나오니 재확인 바란다.

사용자 삽입 이미지

========================================================================


 

컴파일이 정상적으로 끝났다면 이제 우리는 dll파일을 가지고 jar파일을 만들어야 한다.

사용자 삽입 이미지

여기서 중요한 것은 위 그림처럼 dll 파일의 이름이 ‘client.dll'이 맞는지 확인을 해야 한다.

만약 파일 이름이 'client.dll'이 아니라 'HelloWorld.dll'이라면 ‘client.dll'이라고 파일이름을 바꾸어 주길 바란다.

=======================================================================

Tip:

1장에서도 말했지만, client.dll로 파일이름을 바꾸어 주는 이유는 다른 이름의 dll 파일을 Emulator에서 인식을 하지 못한다. 그렇기 때문에 무조건 모두 소!문!자!로 파일이름을 작성해 주기 바란다.

=======================================================================


'client.dll'파일이 있는 걸 확인했다면, 이제 jar파일을 만들어 주어야 하는데, 부가적으로 더 필요한 파일이 있다.

사용자 삽입 이미지

AromaWIPI를 설치했다면, 위 그림과 같은 경로에 파일이 있을 것이다.

파일의 이름은

Clet$CletCard.class

Clet.class

이다.


위에 선택되어 있는 두 class파일을 복사한 후, 전에 HelloWorld 폴더 안에 Debug 폴더로 복사를 해준다.

사용자 삽입 이미지


그럼 위의 그림과 같이 3개의 파일이 구비되어 있는지 확인 후, 이제 jar 압축 파일로 만들어 주어야 한다.

압축하는 방법은 두 가지가 있는데,

첫 번째 방법은 압축 프로그램을 이용하여 jar 파일을 만드는 방법과

두 번째 방법은 도스프롬프트에서 위의 dll파일과 class파일들이 있는 곳으로 들어간 다음에 도스프롬프트상에서 명령어를 쳐서 jar 파일을 만들어 주는 방법이 있다.


우리는 이왕에 공부하는 겸 약간 더 어려운 두 번째 방법으로 jar파일을 만들어 보도록 하겠다.


첫 번째로, [시작] --> [실행]에서 ‘cmd'라고 친 후, 확인을 눌러준다.

사용자 삽입 이미지

그럼 위와 같이 도스프롬프트 창이 뜨는데, 여기서 우리가 clien.dll 파일과 class 파일들이 있는 곳으로 명령어를 쳐서 이동을 해주어야 한다.


명령어는 여러 가지가 있는데, 우리가 사용할 기본적인 것만 알아보도록 하겠다.

1. dir - 이 명령어를 치면, 해당 폴더 안에 들어있는 파일과 폴더들을 출력 해준다.

2. cd 폴더이름 - 하위 폴더에 들어갈 때 사용

3. cd.. - 상위 폴더로 이동할 때 사용


기본적으로 우리는 위에 것들만 알고 있으면 된다.

그럼 이제 창을 띄워놓고 jar파일을 만들어 보도록 하겠다. 우선 도스프롬프트를 이용해서, client.dll 파일과 class 파일들 이 있는 곳으로 들어간다.

만약 그 파일들이 [D:\]에 있다면 깜박이는 커서에서 ‘d:'라고 쳐주면 바뀔 것이다.



사용자 삽입 이미지

<C:\ 드라이브에서 D:\로 이동한 그림>

사용자 삽입 이미지

<client.dll 파일과 class 파일들이 있는 폴더로 이동한 그림> 




이것을 보는 사람들마다 저장해준 경로는 다 틀릴 것이다. 그렇기 때문에 명령어들의 사용법만 잘 익혀서 debug 폴더로 이동하기 바란다.


Debug 폴더로 이동을 했다면, 이제 jar 파일을 만들 명령어만 쳐주면 된다.

명령어를 치는 방법도 두 가지가 있다.

1. jar cvf 만들어줄 jar 파일명 client.dll Clet.class Clet$CletCard.class

2. jar cvf 만들어줄 jar 파일명 client.dll *.class

사용자 삽입 이미지

<jar 두 번째 명령어를 쳐서 jar 파일을 만드는 그림> 


위 그림을 살펴보면, jar cvf game.jar 라고 쳤는데, game.jar 는 내가 만들어줄 jar파일의 파일명을 지정해준 것이다. jar 파일명은 아무거나 해주어도 상관없다.


사용자 삽입 이미지

위의 명령어를 제대로 실행했다면, game.jar 파일이 Debug 폴더 안에 생긴 것을 확인할 수가 있을 것이다.


이제 우리가 jar 파일을 만들었으니 실행하는 일만 남았다.

그럼 이제 Aroma-WIPI Emulator를 실행해 보자.


사용자 삽입 이미지


사용자 삽입 이미지


 

Aroma-WIPI Emulator를 실행하면, 2개의 창이 실행이 될 것이다.


여기서 윗 그림은 jar 파일을 열고, 셋팅을 하는 창이고, 다음 창은 jar 파일을 실행했을 때, 디버깅과 비슷한 일을 수행할 수 있는 창이라고만 알아두면 된다.


사용자 삽입 이미지

그럼 우리가 실행을 하기 위해서 [Jar Path][Jlet's Name(or Clet)]을 설정을 해주어야 하는데, [Jar path]는 [...]버튼을 눌러서 jar 파일을 선택을 해주면 되고, [Jlet's Name(or Clet)]에서는 ‘Clet'이라고 입력하면 된다.  중요한 것은 Jlet's Name(or Clet)을 'Clet'에서의 C를 꼭 대문자로 해주어야 한다는 것이다. 만약 소문자로 해주면, 에뮬레이터가 뿌슝하고, 꺼져버리는 것을 확인할 수 있을 것이다.


사용자 삽입 이미지

사용자 삽입 이미지

<WIPI Emulator 실행화면> 


◯ 소스파일 분석

<여기에 대한 설명은 위피 규격 도움말에서 참조한 것들입니다. 위피 공식 홈페이지 : www.wipi.or.kr>

=========================================================================

#include "WIPIHeader.h"    //  이 헤더 파일은 Clet 프로그램을 한다면 꼬옥 드어가야할 헤더 파일이다. Clet의 모든 설정이 되어 있는 파일이다.


MC_GrpContext cxt;   // 그래픽 컨텍스트

/*

그림 그릴 때 다양한 매개 변수들을 효율적으로 전달하기 위한 구조체이다. 대부분 그리기 함수는 구조체를 매개 변수로 받다. 구조체에는 그리는데 필요한 매개 변수 클리핑, 전경색, 폰트, 스타일, 상대 좌표 체계 등을 가진다.

*/

MC_GrpFrameBuffer bpl;   // 프레임 버퍼

/*

화면 프레임 버퍼나 오프 스크린 프레임 버퍼는 데이타의 포인터와 데이터의 줄당 바이트 (Byte Per Line)으로 기술된다. 기술되는 프레임 버퍼는 MC_GrpFrameBuffer 정의되며, 내부에 데이터와 데이터의 줄당 바이트 , , 높이를 담고 있다.

즉, 내부에 높이와 넓이(핸드폰 화면)와 프레임 버퍼 포인터를 가진다.

*/



void startClet(int argc, char* args[])

{

        MC_knlPrintk("this is My First Program 'Hello WIPI'\n");

        MC_knlPrintk("start Clet!!\n");

/*

MC_knlPrink는 C언어에서 printf와 같은 역할을 한다.

WIPI Emulator에서 보는 바와 같이 검정색 프롬프트 창에 MC_knlPrintk에서 쳐준 것들이 출력이 되는 것을 확인할 수 있을 것이다.

*/

        bpl = MC_grpGetScreenFrameBuffer(0);

/*

현재 화면의 프레임 버퍼를 얻어오는 것으로, 괄호() 안에 0이 들어 있는 경우에는 핸드폰 본체에 LCD화면 프레임 버퍼이고, 1일 경우에는 외부 보조 LCD 화면의 프레임 버퍼를 가져오는 것이다.

만약, 괄호안에 있는 0이나 1값에 대응하는 화면 프레임 버퍼가 없는 경우에는 NULL 값을 반환한다.

*/

        MC_grpInitContext(&cxt);

/*

위의 소스는 우선 cxt 안에 들어 있는 값들을 모두 초기화 한다고 생각하면 된다.

*/

}


void pauseClet()

{

}


void destroyClet()

{

}


void resumeClet()

{

}


void paintClet(int x, int y, int w, int h) // 그림 전용 함수

{

        M_Int32 height;  // M_Int32는 기존 C언어의 int 형과 같다.

        height = MC_GRP_GET_FRAME_BUFFER_HEIGHT(bpl);

/*프레임 버퍼의 높이를 돌려준다. 즉, 핸드폰 화면의 높이를 가져온다는 것이다.*/

        MC_grpDrawString(bpl, 0, height/2, "Hello WIPI", -1, &cxt);

/* 위피 도움말에서 그대로 첨부
    프로토타입
    void MC_grpDrawString(MC_GrpFrameBuffer dst, M_Int32 x, M_Int32 y, const M_Char* str, M_Int32 len, MC_GrpContext* pgc)
    설명

    지정된 프레임 버퍼(Frame Buffer)에 문자열을 그려준다.
    pgc가 지정하는 그래픽 컨텍스트가 지정하는 투명정도와색상/그리기 모드와 지정된 폰트로 문자열을 그린다.
    str은 일반적인 "C" 문자열이 되며 Unicode를 출력하기 위해서는 drawUnicodeString함수를 사용하십시오.
    len이 -1이면 문자가 NULL일때 까지 문자열을 처리하며, len이 0이거나 -1이 아닌 음수이면 화면에 아무것도 출력되지 않는다.
    매개 변수
        [in]    pd     프레임 버퍼
        [in]    bpl    프레임 버퍼의 한 줄당 차지하는 바이트 개수
        [in]    x       문자열의 x축 좌표
        [in]    y       문자열의 baseline의 y축 좌표
        [in]    str     "C" 문자열
        [in]    len     문자열의 길이
        [in]    pgc   그래픽 컨텍스트
    부작용
        없음
    참고 항목
        없음
*/
}


void handleCletEvent(int type, int parm1, int parm2)

{

}

=============================================================================


Clet을 C언어와 기본 구조를 비교해 본다면.


C 언어

============================

#include <stdio.h>


void main()

{}

============================


이것만 있어주면 된다.

하지만 Clet은

============================

#include <WIPIHeader.h>


void startClet()

{}

void pauseClet()

{}

void destroyClet()

{}

void resumeClet()

{}

void paintClet()

{}

void handleCletEvent()

{}

============================

기본구조는 위와 같다.


startClet 함수는 처음 프로그램을 실행할 때 처리할 것들을 넣어주는 함수.

pauseClet 함수는 프로그램을 멈췄을 때 실행할 것을 호출하는 함수.

destoryClet 함수는 프로그램을 종료할 때 실행할 것을 호출하는 함수.

resumeClet 함수는 pauseClet을 호출 했을 때 다시 프로그램을 재개할 때 호출하는 함수.

paintClet 함수는 모든 그림그리는 과정들을 처리해주는 함수.

handleCletEvent는 뭔가 이벤트 처리를 해줄 때 처리해주는 함수이다.


우선 이런 사항들만 기본적으로 머리에 넣어두고, 이해가 될 때까지 계속 코딩을 해보기 바란다. 만약 이해가 안 된다면, 가장 좋은 방법은 무식하게 외우는 방법을 추천해주고 싶다.



그리고 추가적으로 WIPI에 대한 전반적인 함수 설명 및 명령어 도움말들을 수록한 것을 다운 받을 수 있는 곳을 마지막으로 링크 시켜 놓겠다. 

http://www.wipi.or.kr/standard/standard_list.asp



- 끝 -
반응형
Comments