[t:/]$ 지식_

NexioToday Add-on Dll 개발자 메뉴얼

2005/04/28
NexioToday Add-on Dll 개발자 메뉴얼
Copyright ⓒ 2003 삼성전자(주) 컴퓨터시스템사업부

목 차
1. NEXiO Today Add-on DLL……………………………………………………………………3
2. NEXiO Today Add-on DLL 프로젝트 생성………………………………………………… 3
3. Export 함수……………………………………………………………………………………….4
4. MyToday.CPP………………………………………………………………………………….. 4
4.1. WM_TODAY_INIT_CUSTOM_ITEM……………………………………………………….. 6
4.2. WM_TODAY_QUERY_CUSTOM_ITEM_OPTION………………………………………… 6
4.3. WM_TODAY_EXEC_CUSTOM_ITEM_OPTION………………………………………….. 6
4.4. WM_TODAY_REFRESH_CUSTOME_ITEM………………………………………………. 7
4.5. WM_TODAY_UNINIT_CUSTOM_ITEM……………………………………………………. 7
5. Today 명령 메시지………………………………………………………………………………7
6. 사용자 이벤트…………………………………………………………………………………….7
7. 예제 소스………………………………………………………………………………………… 9

1. NEXiO Today Add-on DLL
NEXiO Today Add-on DLL(이하 Add-on DLL)은 Today 프로그램에 의해 로드되어 Today
프로그램내에서 실행되는 라이브러리이다. Add-on DLL의 화면 영역은 Today 화면 영역 일
부를 사용하여 자신만의 고유 기능을 수행한다.
Add-on DLL이 Today 프로그램에 의해 로딩되고 상호 연동되기 위해서는 Today가 제공하
는 API, 윈도메시지, 구조체 그리고 인터페이스를 준수해서 작성되어져야 한다.

Add-on DLL은 Today에 의해 로딩되어 실행되는 코드이므로 add-on DLL의 실행 상 오류
는 Today 프로그램에 영향을 미치게 되어 Today 프로그램이 종료되거나 알 수 없는 에러로
인하여 시스템을 다운 시킬 수도 있다.

2. NEXiO Today Add-on DLL 프로젝트 생성
eMbedded Visual C++ 3.0을 실행하고 “File” 메뉴의 “New”를 선택하면 다음의 화면이 나타난다.

Add-on DLL은 일반 실행 파일이 아니고 라이브러리이므로 “Projects” 탭에서 “WCE Dynamic-Link Library”나 “WCE MFC AppWizard(dll)”을 선택하고 프로젝트 파일을 생성한다. 예제가 Win32 API 방식이므로 여기서는 “WCE Dynamic-Link Library”로 프로젝트를 생성한다.

프로젝트 이름을 “MyToday”라고 입력하고 “OK” 버튼을 누른다. 다음 화면에는 IDE가 프로젝트 파일을 생성할 때 3가지 유형 중의 하나를 선택하라고 보여 주는데, 기본적인 코드가 있는 “A simple Windows CE DLL project.”를 선택한다. DllMain() 함수가 있는 소스 파일이 만들어질 것이다.

3. Export 함수
Add-on DLL에서 반드시 외부 모듈에 의해 호출되는 함수 하나를 정의해야 한다. 이 함수의 이름은 Today 프로그램에 의해 다음과 같이 CustomItemProc()으로 정해져 있다.

MYTODAY_API HANDLE APIENTRY CustomItemProc ( UINT uiMsg,
WPARAM wParam,
LPARAM lParam )

반환값은 HANDLE 데이터 형이며 인자는 윈도 메시지(uiMsg) 그리고 윈도 메시지에 따라
정의되는 2개의 파라메터(wParam, lParam)으로 구성된다.
이 함수는 엑스포트(export)되어져야 하므로 함수 선언 시 이를 명시해야 하는데 MYTODAY_API 상수가이 역할을 담당한다. DLL 프로젝트 파일을 생성하면 기본적으로 “프로젝트명_EXPORTS” 형태의 상수문이 자동으로 정의되는데, MYTODAY_API를 사용하기 전에 다음과 같은 코드가 정의되어야 한다.

#ifdef MYTODAY_EXPORTS
#define MYTODAY_API __declspec(dllexport)
#else
#define MYTODAY_API __declspec(dllimport)
#endif

그리고 .def 파일을 생성해서 이 파일을 프로젝트에 추가해야 한다. 새 파일을 만든 다음 다음과 같은 내용을 입력하고 mytoday.def라는 이름으로 파일을 저장한다.

EXPORTS
CustomItemProc
mytoday.def 파일을 프로젝트에 추가하려면 “Project” 메뉴의 “Add To Project” 메뉴의 “Files…”를 선택하고 나타난 대화상자를 이용해서 mytoday.def 파일을 추가하면 된다.

4. MyToday.CPP
Add-on DLL에 정의된 CustomItemProc() 함수가 Today 프로그램에 의해 호출되는데 uiMsg 윈도 메시지에 따라 적절한 기능을 수행하면 된다. CustomeItemProc()의 예제 코드 가 다음과 같다.
MYTODAY_API HANDLE APIENTRY CustomItemProc (
UINT uiMsg,
WPARAM wParam,
LPARAM lParam
)
{

static HWND hWnd;
switch ( uiMsg )
{
// 사용자 정의 윈도를 생성하기 위하여 Today로부터 발생되는 메시지이다.
case WM_TODAY_INIT_CUSTOM_ITEM:
hWnd = CreateCustomItemWindow((HWND)lParam, (LPTODAYITEM)wParam);
return ((HANDLE)hWnd);

// 사용자 정의 DLL이 옵션 대화상자를 제공는지의 여부를 반환한다.

case WM_TODAY_QUERY_CUSTOM_ITEM_OPTION:

return ((HANDLE)TRUE);

// Today의 아이템 등록정보에서 사용자가 “등록정보” 버튼을 눌렀을 때,

// 이 메시지를 호출하여 대화상자를 나타내는 일을 할 수 있게 한다.

case WM_TODAY_EXEC_CUSTOM_ITEM_OPTION:

DialogBox(g_hInst,

MAKEINTRESOURCE(IDD_OPTION),

(HWND)lParam,

(DLGPROC)OptionDlgProc);

break;

// WM_TODAY_INIT_CUSTOM_ITEM 메시지 때 만든 사용자 정의 윈도의
// 높이 값을 반환해야 한다. 이 값에 따라 Today에서 윈도를 재 정렬한다.
case WM_TODAY_REFRESH_CUSTOM_ITEM:
// 사용자 정의 윈도의 높이 값을 설정한다.
((LPTODAYITEM)wParam)->dwHeight = 60;
return ((HANDLE)TRUE);
break;
// Today 시스템에서 WM_TODAY_INIT_CUSTOM_ITEM 메시지와
// WM_TODAY_UNINIT_CUSTOM_ITEM 메시지가
// 한번 이상 호출될 수 있다.
// 따라서, WM_TODAY_INIT_CUSTOM_ITEM 메시지 때 생성되거나 만들어진 모든
// 리소스들은 반드시 제거되거나 반환해야 한다.
case WM_TODAY_UNINIT_CUSTOM_ITEM:
// 사용자 정의 윈도를 종료한다.
DestroyWindow(hWnd);
// 등록한 윈도 클래스를 해제한다.
UnregisterClass(((LPTODAYITEM)wParam)->szItemName, g_hInst);
break;
}
return (NULL);

}
uiMsg 윈도 메시지를 switch 문에 의해 구분하여 해당 메시지에 따른 기능을 수행하는 기본
적인 윈도
시스템 구조를 따른다. uiMsg 윈도 메시지는 제공되는 today_common.h 헤더 파일에 다음
과 같이 정의
되어 있다.
// Today 프로그램에서 사용자 정의 아이템 DLL에게 보내는 윈도 메시지
#define WM_TODAY_INIT_CUSTOM_ITEM (WM_USER+300)
#define WM_TODAY_QUERY_CUSTOM_ITEM_OPTION (WM_USER+301)
#define WM_TODAY_EXEC_CUSTOM_ITEM_OPTION (WM_USER+302)
#define WM_TODAY_REFRESH_CUSTOM_ITEM (WM_USER+303)
#define WM_TODAY_UNINIT_CUSTOM_ITEM (WM_USER+304)
4.1. WM_TODAY_INIT_CUSTOM_ITEM
Add-on DLL이 Today 프로그램에 의해 로드되고 처음 발생하는 메시지이다. 이 메시지가
발생하였을
때의 파라메터는 다음과 같다.
WPARAM: LPTODAYITEM 데이터 형으로 TODAYITEM 구조체의 포인터
LPARAM: Today의 아이템 뷰 윈도의 핸들 값으로 윈도가 생성되어 부모 윈도로 사용되어야 함
이 메시지가 발생했을 때는 add-on DLL의 기능을 수행하기 위하여 필요한 윈도를 생성하여생성한 윈도의 핸들 값을 반환해야 한다.

4.2. WM_TODAY_QUERY_CUSTOM_ITEM_OPTION
이 메시지는 Today의 아이템 등록정보 대화상자에서 해당 Today 아이템을 선택하였을 때
“등록정보”
버튼을 활성화할 것인지 비활성화할 것인지를 정하기 위해 발생한다. 따라서 add-on DLL이 등록정보 대화상자를 제공한다면 TRUE를 그렇지 않다면 FALSE 값을 반환해야 한다. 이때 TRUE 값을 반환하면 “등록정보” 버튼이 활성화되어 사용자가 버튼을 누르면 대화상자를 나타내기 위하여 Today 프로그램이 add-on DLL에 WM_TODAY_EXEC_CUSTOM_ITEM_OPTION 윈도 메시지를 전송한다.
WPARAM: 사용 안 함
LPARAM: 사용 안 함

4.3. WM_TODAY_EXEC_CUSTOM_ITEM_OPTION
이 메시지는 사용자가 Today 프로그램의 아이템 등록정보 대화상자에서 “등록정보” 버튼을
눌렀을 때 발생한다. 이 메시지가 발생하면 add-on DLL은 대화상자를 제공해야 한다.
WPARAM: 사용 안 함
LPARAM: oday의 아이템 뷰 윈도의 핸들 값

4.4. WM_TODAY_REFRESH_CUSTOME_ITEM
이 메시지는 Today 프로그램이 Today 아이템들의 초기화가 필요할 때 발생한다. 이 메시지
를 받게 되면 아이템을 재 갱신하고 자신의 윈도의 높이 값을 반환해야 한다. 이 값은 WPARAM에 의해 가리키는 구조체의 dwHeight 필드에 설정하면 된다.
WPARAM: LPTODAYITEM 데이터 형으로 TODAYITEM 구조체의 포인터
LPARAM: 사용 안 함
반환값은 처리 여부에 따라 TRUE나 FALSE 값을 반환한다. 현 버전에서는 add-on DLL이
초기화 될
때 윈도의 높이 값을 얻기 위하여 사용되고 있다. 그러므로 반드시 윈도의 크기 값을 반환하
여야 한다.

4.5. WM_TODAY_UNINIT_CUSTOM_ITEM
이 메시지는 Today 프로그램이 자신의 Today 아이템 윈도를 종료하기 위하여 전송한다. 그
러므로 이 메시지를 받은 아이템 윈도는 자신의 윈도를 종료하고 사용한 메모리를 반환하거나 초기화시 했던 작업에 대한 정리 작업을 수행해야 한다. 반환값은 없다.
WPARAM: 사용 안 함
LPARAM: 사용 안 함

5. Today 명령 메시지
제공되는 today_common.h 헤더 파일에 Today 명령 메시지가 다음과 같이 정의되어 있다.
// 사용자 정의 아이템 DLL이 Today 프로그램에게 보내는 명령 윈도 메시지
#define WM_TODAY_REQ_BACKGROUND (WM_USER+400)
이 메시지는 자신의 윈도 영역에 Today가 사용하는 스킨 이미지로 채워져야 할 필요가 있을
때 자신의
부모 윈도로 이 메시지를 다음과 같이 보내면 된다.
SendMessage(GetParent(hWnd), // 사용자 정의 아이템 윈도의 부모 윈도
WM_TODAY_REQ_BACKGROUND,
(WPARAM)hWnd, // 그려질 영역이 있는 윈도 핸들 값
(LPARAM)&ps.rcPaint); // 그려질 영역
이 메시지는 Today의 배경 이미지 위에 투명하게 작업을 해야 할 때 필요하다. 그렇지 않고
자신 만의 배경 이미지를 가진다면 이 메시지를 호출하지 않아도 된다.

6. 사용자 이벤트
생성된 사용자 정의 아이템 윈도는 완전한 윈도이므로 사용자가 취하는 입력 이벤트 윈도 메시지를 처리할 수 있다. 사용자가 스타일러스 펜을 자신의 윈도 영역에 탭을 하거나 하는 등의 윈도 메시지를 전달 받을 수 있다. 그러므로 사용자가 탭을 했을 때 어떤 일을 수행하고자 한다면 자신의 윈도 함수에서 다음과 같이 마우스 메시지를 처리한다.
case WM_LBUTTONUP:
MessageBox(hWnd,
TEXT(“화면을 탭(Tab) 하셨습니다.”),
TEXT(“삼성 Today Add-on 예제 프로그램”),
MB_OK);
break;

7. 예제 소스
MyToday.cpp
/**
* Today Add-on Sample Program
*
* Copyright 2003 by Computer System Division, Samsung Electronics, Inc.,
* All rights reserved.
*
*/
/**
* Defines the entry point for the application.
* IRIS(NEXiO S150, S151)용으로 개발되는 Today Add-on 예제 소스
*/
#include “stdafx.h”
#include “resource.h”
#include “MyToday.h”
// 상수문
#define COLOR_NUM 7
// 전역변수
COLORREF g_crCustom[] =
{
RGB(0, 0, 0), // 검정색
RGB(255, 0, 0), // 빨간색
RGB(0, 255, 0), // 녹색
RGB(0, 0, 255), // 파란색
RGB(255, 128, 0), // 오렌지색
RGB(255, 255, 0), // 노랑색
RGB(255, 255, 255) // 흰색
};
LPCTSTR g_szColor[] =
{
TEXT(“검정색”),
TEXT(“빨간색”),
TEXT(“녹색”),
TEXT(“파란색”),
TEXT(“오렌지색”),

TEXT(“노랑색”),
TEXT(“흰색”),
};
int g_crText, g_crTextBk, g_crBkg;
BOOL g_bTextBkTr, g_bBkgTr;
HINSTANCE g_hInst;
//
HWND CreateCustomItemWindow(HWND, LPTODAYITEM);
LRESULT CALLBACK CustomItemWndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK OptionDlgProc(HWND, UINT, WPARAM, LPARAM);
void InitOptionDlg(HWND);
void SaveOptionDlg(HWND);
void GetMyTodayOption(void);
/**
* Defines the entry function.
*
* @Param
* @Return
* @Exception
* @Author
* @Version
* @Description
*/
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
// 인스턴스 핸들 값을 전역 변수에 저장한다.
g_hInst = (HINSTANCE)hModule;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;

}
return TRUE;
}
/**
* Today 시스템에 노출되는 엑스포트 함수이다.
*
* @Param
* @Return
* @Exception
* @Author
* @Version
* @Description
*/
MYTODAY_API HANDLE APIENTRY CustomItemProc ( UINT uiMsg, WPARAM wParam, LPARAM lParam )
{
static HWND hWnd;
switch ( uiMsg )
{
// 사용자 정의 윈도를 생성하기 위하여 Today로부터 발생되는 메시지이다.
case WM_TODAY_INIT_CUSTOM_ITEM:
hWnd = CreateCustomItemWindow((HWND)lParam, (LPTODAYITEM)wParam);
return ((HANDLE)hWnd);
// 사용자 정의 DLL이 옵션 대화상자를 제공는지의 여부를 반환한다.
case WM_TODAY_QUERY_CUSTOM_ITEM_OPTION:
return ((HANDLE)TRUE);
// Today의 아이템 등록정보에서 사용자가 “등록정보” 버튼을 눌렀을 때,
// 이 메시지를 호출하여 대화상자를 나타내는 일을 할 수 있게 한다.
case WM_TODAY_EXEC_CUSTOM_ITEM_OPTION:
DialogBox(g_hInst,
MAKEINTRESOURCE(IDD_OPTION),
(HWND)lParam,
(DLGPROC)OptionDlgProc);
break;
// WM_TODAY_INIT_CUSTOM_ITEM 메시지 때 만든 사용자 정의 윈도의
// 높이 값을 반환해야 한다. 이 값에 따라 Today에서 윈도를 재 정렬한다.
case WM_TODAY_REFRESH_CUSTOM_ITEM:
// 사용자 정의 윈도의 높이 값을 설정한다.
((LPTODAYITEM)wParam)->dwHeight = 60;
return ((HANDLE)TRUE);
break;
// Today 시스템에서 WM_TODAY_INIT_CUSTOM_ITEM 메시지와 WM_TODAY_UNINIT_CUSTOM_ITEM

// 메시지가 한번 이상 호출될 수 있다.
// 따라서, WM_TODAY_INIT_CUSTOM_ITEM 메시지 때 생성되거나 만들어진 모든
// 리소스들은 반드시 제거되거나 반환해야 한다.
case WM_TODAY_UNINIT_CUSTOM_ITEM:
// 사용자 정의 윈도를 종료한다.
DestroyWindow(hWnd);
// 등록한 윈도 클래스를 해제한다.
UnregisterClass(((LPTODAYITEM)wParam)->szItemName, g_hInst);
break;
}
return (NULL);
}
/**
* Defines the entry function.
*
* @Param
* @Return
* @Exception
* @Author
* @Version
* @Description
*/
HWND CreateCustomItemWindow ( HWND hWndParent, LPTODAYITEM lpTodayItem )
{
HWND hWnd;
WNDCLASS wc;
wc.style = 0;
wc.lpfnWndProc = (WNDPROC)CustomItemWndProc;
wc.cbClsExtra= 0;
wc.cbWndExtra = 0;
wc.hInstance = g_hInst;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground= NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName= lpTodayItem->szItemName;
if ( !RegisterClass(&wc) )
// WM_TODAY_REFRESH_CUSTOM_ITEM 메시지 때 윈도의 높이 값을 반환하므로
// 여기서는 x, y, cx, cy의 파라메터의 의미가 없다.

hWnd = CreateWindow(wc.lpszClassName, NULL, WS_CHILD,
0, 0, 0, 0,
hWndParent,
NULL,
g_hInst,
NULL);
else
return (NULL);
return (hWnd);
}
/**
* Defines the entry function.
*
* @Param
* @Return
* @Exception
* @Author
* @Version
* @Description
*/
LRESULT CALLBACK CustomItemWndProc ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
)
{
PAINTSTRUCT ps;
RECT rc;
HDC hdc;
COLORREF crTextOld, crTextBkOld;
int nBkModeOld;
HBRUSH hbrBk;
switch ( message )
{
case WM_CREATE:
GetMyTodayOption();
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
//
if ( g_bBkgTr )
// 배경 이미지의 드로잉 작업을 Today 시스템에게 요청한다.
// WPARAM은 배경 이미지를 그릴 윈도의 핸들 값

// LPARAM은 배경 이미지가 그려지는 영역
SendMessage(GetParent(hWnd), WM_TODAY_REQ_BACKGROUND, (WPARAM)hWnd,
(LPARAM)&ps.rcPaint);
else
{
hbrBk = CreateSolidBrush(g_crCustom[g_crBkg]);
FillRect(hdc, &ps.rcPaint, hbrBk);
DeleteObject((HGDIOBJ)hbrBk);
}
//
crTextOld = SetTextColor(hdc, g_crCustom[g_crText]);
crTextBkOld = SetBkColor(hdc, g_crCustom[g_crTextBk]);
if ( g_bTextBkTr ) nBkModeOld = SetBkMode(hdc, TRANSPARENT);
else nBkModeOld = SetBkMode(hdc, OPAQUE);
//
GetClientRect(hWnd, &rc);
DrawText(hdc, TEXT(“삼성 Today Add-on 예제 프로그램입니다. 여기를 탭(Tab) 해보세요.”),
-1, &rc, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
//
SetTextColor(hdc, crTextOld);
SetBkColor(hdc, crTextBkOld);
SetBkMode(hdc, nBkModeOld);
//
EndPaint(hWnd, &ps);
break;
case WM_LBUTTONUP:
MessageBox(hWnd, TEXT(“화면을 탭(Tab) 하셨습니다.”),
TEXT(“삼성 Today Add-on 예제 프로그램”), MB_OK);
break;
default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
return (0);
}
/**
* Defines the entry function.
*
* @Param
* @Return
* @Exception
* @Author

* @Version
* @Description
*/
LRESULT CALLBACK OptionDlgProc ( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
HWND hWndControl;
switch ( message )
{
case WM_INITDIALOG:
GetMyTodayOption();
InitOptionDlg(hDlg);
break;
case WM_COMMAND:
switch ( LOWORD(wParam) )
{
case IDOK:
SaveOptionDlg(hDlg);
// FALL THROUGH
case IDCANCEL:
EndDialog(hDlg, LOWORD(wParam));
return (TRUE);
case IDC_TRANSPARENT_TEXT:
// FALL THROUGH
case IDC_TRANSPARENT_BKG:
if ( LOWORD(wParam) == IDC_TRANSPARENT_TEXT )
hWndControl = GetDlgItem(hDlg, IDC_TEXTBK_COLOR_COMBO);
else
hWndControl = GetDlgItem(hDlg, IDC_BKG_COLOR_COMBO);
if ( HIWORD(wParam) == BN_CLICKED )
{
if ( SendMessage((HWND)lParam, BM_GETCHECK, 0, 0) ==
BST_CHECKED )
EnableWindow(hWndControl, FALSE);
else
EnableWindow(hWndControl, TRUE);
}
break;
}
break;
}
return (FALSE);

}
/**
* Defines the entry function.
*
* @Param
* @Return
* @Exception
* @Author
* @Version
* @Description
*/
void InitOptionDlg ( HWND hDlg )
{
DWORD dwIdx;
HWND hWndText, hWndTextBk, hWndBkg;
// 콤보박스 컨트롤의 윈도 핸들 값을 구한다.
hWndText = GetDlgItem(hDlg, IDC_TEXT_COLOR_COMBO);
hWndTextBk = GetDlgItem(hDlg, IDC_TEXTBK_COLOR_COMBO);
hWndBkg = GetDlgItem(hDlg, IDC_BKG_COLOR_COMBO);
// 콤보박스 컨트롤에 항목을 초기화 한다.
for ( dwIdx=0; dwIdx<COLOR_NUM; dwIdx++ )
{
SendMessage(hWndText, CB_ADDSTRING, 0, (LPARAM)g_szColor[dwIdx]);
SendMessage(hWndTextBk, CB_ADDSTRING, 0, (LPARAM)g_szColor[dwIdx]);
SendMessage(hWndBkg, CB_ADDSTRING, 0, (LPARAM)g_szColor[dwIdx]);
}
// 텍스트 색을 검정색으로 초기화 한다.
SendMessage(hWndText, CB_SETCURSEL, (WPARAM)g_crText, 0);
// 텍스트 배경색을 흰색으로 초기화 한다.
SendMessage(hWndTextBk, CB_SETCURSEL, (WPARAM)g_crTextBk, 0);
// 윈도 배경색을 파란색으로 초기화 한다.
SendMessage(hWndBkg, CB_SETCURSEL, (WPARAM)g_crBkg, 0);
if ( g_bTextBkTr )
{
SendMessage(GetDlgItem(hDlg, IDC_TRANSPARENT_TEXT), BM_SETCHECK,
(WPARAM)BST_CHECKED, 0);
EnableWindow(GetDlgItem(hDlg, IDC_TEXTBK_COLOR_COMBO), FALSE);
}

if ( g_bBkgTr )
{
SendMessage(GetDlgItem(hDlg, IDC_TRANSPARENT_BKG), BM_SETCHECK,
(WPARAM)BST_CHECKED, 0);
EnableWindow(GetDlgItem(hDlg, IDC_BKG_COLOR_COMBO), FALSE);
}
}
/**
* Defines the entry function.
*
* @Param
* @Return
* @Exception
* @Author
* @Version
* @Description
*/
void SaveOptionDlg ( HWND hDlg )
{
HWND hWndText, hWndTextBk, hWndBkg;
HWND hWndCheck;
DWORD dwDisp;
HKEY hRegKey;
// 콤보박스 컨트롤의 윈도 핸들 값을 구한다.
hWndText = GetDlgItem(hDlg, IDC_TEXT_COLOR_COMBO);
hWndTextBk = GetDlgItem(hDlg, IDC_TEXTBK_COLOR_COMBO);
hWndBkg = GetDlgItem(hDlg, IDC_BKG_COLOR_COMBO);
// 설정된 색의 값을 구한다.
g_crText = SendMessage(hWndText, CB_GETCURSEL, 0, 0);
g_crTextBk = SendMessage(hWndTextBk, CB_GETCURSEL, 0, 0);
g_crBkg = SendMessage(hWndBkg, CB_GETCURSEL, 0, 0);
// 텍스트의 배경색을 투명하게 설정되어 있는지 검사한다.
hWndCheck = GetDlgItem(hDlg, IDC_TRANSPARENT_TEXT);
if ( SendMessage(hWndCheck, BM_GETCHECK, 0, 0) == BST_CHECKED )
g_bTextBkTr = TRUE;
else
g_bTextBkTr = FALSE;
// 윈도의 바탕색을 투명하게 설정되어 있는지 검사한다.

hWndCheck = GetDlgItem(hDlg, IDC_TRANSPARENT_BKG);
if ( SendMessage(hWndCheck, BM_GETCHECK, 0, 0) == BST_CHECKED )
g_bBkgTr = TRUE;
else
g_bBkgTr = FALSE;
//
RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT(“Software\\MyToday”),
0, NULL, 0, 0, NULL, &hRegKey, &dwDisp);
RegSetValueEx(hRegKey, TEXT(“TextColor”), NULL, REG_DWORD, (LPBYTE)&g_crText, sizeof(DWORD));
RegSetValueEx(hRegKey, TEXT(“TextBkColor”), NULL, REG_DWORD, (LPBYTE)&g_crTextBk,
sizeof(DWORD));
RegSetValueEx(hRegKey, TEXT(“BkgColor”), NULL, REG_DWORD, (LPBYTE)&g_crBkg, sizeof(DWORD));
RegSetValueEx(hRegKey, TEXT(“UseTextBk”), NULL, REG_DWORD, (LPBYTE)&g_bTextBkTr,
sizeof(DWORD));
RegSetValueEx(hRegKey, TEXT(“UseBkgColor”), NULL, REG_DWORD, (LPBYTE)&g_bBkgTr,
sizeof(DWORD));
RegCloseKey(hRegKey);
}
/**
* Defines the entry function.
*
* @Param
* @Return
* @Exception
* @Author
* @Version
* @Description
*/
void GetMyTodayOption ( void )
{
DWORD dwDisp;
HKEY hRegKey;
DWORD dwType, cbName;
RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT(“Software\\MyToday”),
0, NULL, 0, 0, NULL, &hRegKey, &dwDisp);
if ( dwDisp == REG_CREATED_NEW_KEY )
{
// 텍스트 색을 검정색으로 초기화 한다.
g_crText = 0;
// 텍스트 배경색을 흰색으로 초기화 한다.

g_crTextBk = 6;
// 윈도 배경색을 파란색으로 초기화 한다.
g_crBkg = 3;
// 배경색과 바탕색을 사용한다.
g_bTextBkTr = g_bBkgTr = FALSE;
RegSetValueEx(hRegKey, TEXT(“TextColor”), NULL, REG_DWORD, (LPBYTE)&g_crText,
sizeof(DWORD));
RegSetValueEx(hRegKey, TEXT(“TextBkColor”), NULL, REG_DWORD, (LPBYTE)&g_crTextBk,
sizeof(DWORD));
RegSetValueEx(hRegKey, TEXT(“BkgColor”), NULL, REG_DWORD, (LPBYTE)&g_crBkg,
sizeof(DWORD));
RegSetValueEx(hRegKey, TEXT(“UseTextBk”), NULL, REG_DWORD, (LPBYTE)&g_bTextBkTr,
sizeof(DWORD));
RegSetValueEx(hRegKey, TEXT(“UseBkgColor”), NULL, REG_DWORD, (LPBYTE)&g_bBkgTr,
sizeof(DWORD));
}
else
{
dwType = REG_DWORD;
cbName = sizeof(DWORD);
RegQueryValueEx(hRegKey, TEXT(“TextColor”), NULL, &dwType, (LPBYTE)&g_crText, &cbName);
RegQueryValueEx(hRegKey, TEXT(“TextBkColor”), NULL, &dwType, (LPBYTE)&g_crTextBk,
&cbName);
RegQueryValueEx(hRegKey, TEXT(“BkgColor”), NULL, &dwType, (LPBYTE)&g_crBkg, &cbName);
RegQueryValueEx(hRegKey, TEXT(“UseTextBk”), NULL, &dwType, (LPBYTE)&g_bTextBkTr,
&cbName);
RegQueryValueEx(hRegKey, TEXT(“UseBkgColor”), NULL, &dwType, (LPBYTE)&g_bBkgTr,
&cbName);
}
RegCloseKey(hRegKey);
}
MyToday.RC
//Microsoft Developer Studio generated resource script.
//
#include “resource.h”
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//

// Generated from the TEXTINCLUDE 2 resource.
//
#include “afxres.h”
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// Korean resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR)
#ifdef _WIN32
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
#pragma code_page(949)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_OPTION DIALOG DISCARDABLE 0, 0, 129, 115
STYLE DS_SETFOREGROUND | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION |
WS_SYSMENU
CAPTION “Custom Item Option Dialog”
FONT 12, “굴림”
BEGIN
COMBOBOX IDC_TEXT_COLOR_COMBO,45,7,48,55,CBS_DROPDOWNLIST |
WS_VSCROLL | WS_TABSTOP
CONTROL “투명하게 처리”,IDC_TRANSPARENT_TEXT,”Button”,
BS_AUTOCHECKBOX | WS_TABSTOP,10,37,57,12
COMBOBOX IDC_TEXTBK_COLOR_COMBO,68,37,48,55,CBS_DROPDOWNLIST |
WS_VSCROLL | WS_TABSTOP
CONTROL “투명하게 처리”,IDC_TRANSPARENT_BKG,”Button”,
BS_AUTOCHECKBOX | WS_TABSTOP,10,70,57,12
COMBOBOX IDC_BKG_COLOR_COMBO,68,70,48,55,CBS_DROPDOWNLIST |
WS_VSCROLL | WS_TABSTOP
DEFPUSHBUTTON “확인”,IDOK,7,94,50,14
PUSHBUTTON “취소”,IDCANCEL,72,94,50,14
LTEXT “텍스트 색:”,IDC_STATIC,7,9,34,12
GROUPBOX “텍스트 배경색”,IDC_STATIC,7,25,116,29
GROUPBOX “바탕색”,IDC_STATIC,7,58,116,29
END

/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
IDD_OPTION, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 122
TOPMARGIN, 7
BOTTOMMARGIN, 108
END
END
#endif // APSTUDIO_INVOKED
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE
BEGIN
“resource.h\0”
END
2 TEXTINCLUDE DISCARDABLE
BEGIN
“#include “”afxres.h””\r\n”
“\0”
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
“\r\n”
“\0”
END

#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Dialog Info
//
IDD_OPTION DLGINIT
BEGIN
IDC_TEXT_COLOR_COMBO, 0x403, 8, 0
0x0052, 0x0065, 0x0064, 0x0000,
IDC_TEXT_COLOR_COMBO, 0x403, 12, 0
0x0047, 0x0072, 0x0065, 0x0065, 0x006e, 0x0000,
IDC_TEXT_COLOR_COMBO, 0x403, 10, 0
0x0042, 0x006c, 0x0075, 0x0065, 0x0000,
IDC_TEXTBK_COLOR_COMBO, 0x403, 8, 0
0x0052, 0x0065, 0x0064, 0x0000,
IDC_TEXTBK_COLOR_COMBO, 0x403, 12, 0
0x0047, 0x0072, 0x0065, 0x0065, 0x006e, 0x0000,
IDC_TEXTBK_COLOR_COMBO, 0x403, 10, 0
0x0042, 0x006c, 0x0075, 0x0065, 0x0000,
IDC_BKG_COLOR_COMBO, 0x403, 8, 0
0x0052, 0x0065, 0x0064, 0x0000,
IDC_BKG_COLOR_COMBO, 0x403, 12, 0
0x0047, 0x0072, 0x0065, 0x0065, 0x006e, 0x0000,
IDC_BKG_COLOR_COMBO, 0x403, 10, 0
0x0042, 0x006c, 0x0075, 0x0065, 0x0000,
0
END
#endif // Korean resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//

/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
MyToday.H
// The following ifdef block is the standard way of creating macros which make exporting
// from a DLL simpler. All files within this DLL are compiled with the MYTODAY_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see
// MYTODAY_API functions as being imported from a DLL, wheras this DLL sees symbols
// defined with this macro as being exported.
#ifdef MYTODAY_EXPORTS
#define MYTODAY_API __declspec(dllexport)
#else
#define MYTODAY_API __declspec(dllimport)
#endif
MYTODAY_API HANDLE APIENTRY CustomItemProc(UINT, WPARAM, LPARAM);
Today_Common.H
/** Today_Common.H
*
* Copyright 2002 by Computer System Division, Samsung Electronics, Inc.,
* All rights reserved.
*
*/
#ifndef _TODAY_COMMON_H_
#define _TODAY_COMMON_H_
#define ITEM_ENABLED 1
#define ITEM_DISABLED 0
// 사용자 정의 아이템 구조체
// Today 프로그램과 사용자 정의 아이템 DLL간
typedef struct TodayItemTag
{
TCHAR szItemName[MAX_PATH]; // MAX_PATH는 윈도우 헤더 파일 WinDef.H에 정의되어 있다.
DWORD dwItemEnabled; // 항상 ITEM_ENABLED
DWORD dwItemOrder; // 아이템 등록정보 리스트에서 0-based 순번

DWORD dwHeight; // 이 필드에 생성하는 윈도의 높이 값을 저장해서 반환해야 한다.
DWORD crTextColor; // 스킨에서 사용 중인 텍스트 색(COLORREF 데이터 형)
} TODAYITEM, *LPTODAYITEM;
// Today 프로그램에서 사용자 정의 아이템 DLL에게 보내는 윈도 메시지
#define WM_TODAY_INIT_CUSTOM_ITEM (WM_USER+300)
#define WM_TODAY_QUERY_CUSTOM_ITEM_OPTION (WM_USER+301)
#define WM_TODAY_EXEC_CUSTOM_ITEM_OPTION (WM_USER+302)
#define WM_TODAY_REFRESH_CUSTOM_ITEM (WM_USER+303)
#define WM_TODAY_UNINIT_CUSTOM_ITEM (WM_USER+304)
// 사용자 정의 아이템 DLL이 Today 프로그램에게 보내는 명령 윈도 메시지
#define WM_TODAY_REQ_BACKGROUND (WM_USER+400)
// 사용자 정의 아이템은 다음 이름의 함수가 호출 될 수 있어야 한다.
#define CUSTOM_ITEM_PROC TEXT(“CustomItemProc”)
// CUSTOM_ITEM_PROC 함수의 prototype 데이터 형
typedef HANDLE (*PFUNCCUSTOMITEM)(UINT, WPARAM, LPARAM);
#endif // end of _TODAY_COMMON_H_

재승

디스플레이를 ON / OFF 하는 KernelIoControl 입니다.
사용 방법

헤더 파일에 아래 추가

BOOL KernelIoControl(DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD);

// public\common\oak\inc\windev.h
#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)

// public\common\sdk\inc\winioctl.h
#define FILE_DEVICE_HAL 0x00000101
#define METHOD_BUFFERED 0
#define FILE_ANY_ACCESS 0

#define IOCTL_DISPLAY_ON \
CTL_CODE(FILE_DEVICE_HAL, 2068, METHOD_BUFFERED, FILE_ANY_ACCESS) //esper 22k0708 edit
#define IOCTL_DISPLAY_OFF \
CTL_CODE(FILE_DEVICE_HAL, 2069, METHOD_BUFFERED, FILE_ANY_ACCESS) //esper 22k0708 edit

#define IOCTL_HAL_OEM_BACKLIGHT_OFF \
CTL_CODE(FILE_DEVICE_HAL, 2077, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_OEM_BACKLIGHT_ON \
CTL_CODE(FILE_DEVICE_HAL, 2078, METHOD_BUFFERED, FILE_ANY_ACCESS)

프로그램 루틴에서 아래와 같이 호출하면 됩니다.

화면 끄기

KernelIoControl(IOCTL_DISPLAY_ON, NULL, 0, NULL, 0, NULL);

화면 켜기
KernelIoControl(IOCTL_DISPLAY_ON, NULL, 0, NULL, 0, NULL);

백라이트 켜기
KernelIoControl(IOCTL_HAL_OEM_BACKLIGHT_ON, NULL, 0, NULL, 0, NULL);

백라이트 끄기

KernelIoControl(IOCTL_HAL_OEM_BACKLIGHT_OFF, NULL, 0, NULL, 0, NULL);








[t:/] is not "technology - root". dawnsea, rss