티스토리 뷰


3D carousel
<출처 : http://www.spbsoftwarehouse.com>

요즘 스마트 폰이 뜨면서, 사용자 편의 성을 증대 시켜주는 어플리케이션에 대한 관심이 높아지고 있다.

그 중에서도 단연 돋보이는 관심을 받는 것은 SHELL Application!! 단말의 첫 화면이고, 사용자가 원하는 메뉴를 한번에 접근하게 하는 어플...

그 중에 Windows Mobile에서 대기 화면에 사용자 어플을 끼워 넣는 방법을 알아보도록 하자.

1. Today Plugin
  • Windows Mobile은 dll을 이용한 plugin 모듈로 대기 화면에 사용자의 어플리케이션을 등록할 수 있다.
  • 화면 전체를 점유할 수도 있지만, 시작 메뉴와 소프트키 메뉴까지 점유하는 방식은 권장하지 않는다.
2. Today Plugin Project 생성
  • 우선 Visual Studio 2005를 설치한다.
  • Windows Mobile 6 Professional SDK를 설치 한다.
  • 메뉴->새로 만들기->프로젝트 를 선택해서 새 프로젝트를 생성하자.
  • 프로젝트 형식은 "스마트 장치"를 선택하고, "Win32 스마트 장치 프로젝트"를 템플릿으로 선택한다.
  • 프로젝트 이름을 선택한 후, "확인" 클릭.
  • Win32 스마트 장치 프로젝트 마법사가 보이면 "다음"을 선택
  • 그런 다음 현재 프로젝트에 추가할 플랫폼 SDK를 선택하면 되는데, 필자는 Windows Mobile 6 Profressional SDK만 선택한다. "다음" 클릭.
  • 응용 프로그램 종류에서 DLL을 선택하고 나머진 기호에 따라 선택해도 무방.
  • "마침" 클릭.

3. Today Plugin으로 등록할 때 export해야 할 api를 만들자.
  • DllMain 함수에 다음과 같은 처리를 추가해준다.
    • switch (ul_reason_for_call){
          case DLL_PROCESS_ATTACH:
              if (g_hInst == NULL)
                  g_hInst = (HINSTANCE)hModule;
              break;

          case DLL_PROCESS_DETACH:
              if (g_hInst != NULL) {
                  SAFE_INSTANCE_RELEASE(g_WinApp);
                  UnregisterClass(TODAYPLUGIN_NAME, g_hInst);
              }
              g_hInst = NULL;
              break;
          }
  • project를 생성하면 해당 프로젝트 이름에 .cpp가 붙은 파일이 생성 되는데 이 파일에 다음 두가지 api를 추가 한다.
    • HWND APIENTRY InitializeCustomItem(TODAYLISTITEM* pTLI, HWND hWndParent)
    • LRESULT WINAPI CustomItemOptionsDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  • InitializeCustomItem api는 처음 today plugin이 initialize될 때, 호출되는 api이다. 이때는 plugin에 보여질 window를 생성하여, 해당 윈도우 핸들을 리턴하면 된다.
  • CustomItemOptionsDlgProc api는 plugin의 옵션을 설정할 때, 설정 윈도우를 보여줄 때, 호출되는 api이다. 다이얼로그로 만들어서 띄워보면 어떻게 해야할 지 쉽게 알 수 있다.
    • WM_INITDIALOG 메세지가 message로 넘어오면 새로운 Dialog를 만들어서, 보여주면 된다.
4. ($ProjectName).def 파일을 만들고 프로젝트에 추가한 후 다음과 같이 설정한다.

  • ; today_plugin.def : Declares the module parameters for the DLL.

    LIBRARY      "today_plugin"

    EXPORTS
    ; Explicit exports can go here
    InitializeCustomItem        @240    NONAME
    CustomItemOptionsDlgProc    @241    NONAME

5. 나머지 윈도우의 동작들은 InitializeCustomItem 에서 win32 에서 window하나를 만들어서 보여주는 모든 방식과 동일하게 만들면 된다.

6. Today Plugin용으로 생성된 윈도우는 일반 윈도우가 처리해야할 message뿐만 아니라 다음과 같은 6개의 message를 추가적으로 처리해 주어야 한다.
  • WM_TODAYCUSTOM_CLEARCACHE
  • WM_TODAYCUSTOM_QUERYREFRESHCACHE
  • WM_TODAYCUSTOM_RECEIVEDSELECTION
  • WM_TODAYCUSTOM_LOSTSELECTION
  • WM_TODAYCUSTOM_USERNAVIGATION
  • WM_TODAYCUSTOM_ACTION
  • 위의 메세지 리스트에서 알 수 있듯이, 대기화면 상에서 today plugin이 unload 될 때, 사용하고 있던 heap을 정리한다거나, 로드 될 때 cache를 로드한다거나, plugin이 선택 되거나 포커스를 잃거나, 사용자가 방향키를 움직이거나, plugin 동작이 시작되어야 하는 시점을 명시적으로 알려준다. 이에 대한 처리는 따로 구현해야 함을 잊지 말자.



!! 여기서 주의 할 점들에 대해서 정리 해보면.
  1. today plugin은 DLL 로 만든다.
  2. today plugin은 화면에 등록되어 있으면 단말이 화면에 설정된 후 무조건 로드 되기 때문에, 메모리와 같은 리소스를 최대한 작게 사용하도록 만들어야 한다.
  3. 시작 메뉴나 시스템 메뉴의 위치를 포함하는 전체화면을 사용하는 plugin은 작성하면 안된다. (해당 메뉴에 대한 컨트롤을 보장할 수 없다.)
  4. 단말사나 이통사에서 plugin 영역에 특정 plugin이 로드 되면 다른 plugin을 동시에 화면에 보여주지 않도록 하는 경우가 있는데 (ex : samsung Omnia today) 이런 경우 사용자가 만든 plugin을 화면에 등록할 수 없다. (방법없음.)

다음 포스팅 때에, 배포 방법과 Debugging 방법에 대해 기술하고 필자가 작성한 예제의 결과물을 올리려한다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함