#include <Shellapi.h> // 트레이아이콘을 사용하기 위한 헤더 파일
// 트레이 아이콘 USER 메시지 정의
#define WM_ICONNOTIFY (WM_USER + 101)
// 트레이 아이콘을 지원하기 위한 함수
// 작동하는 부분의 HWND를 넘겨줘야 한다.
void Notification(HWND hWnd)
{
// 사용할 트레이 아이콘의 정보를 담은 변수를 선언하여 0으로 초기화 한다.
NOTIFYICONDATA nid = {0};
// 사이즈를 등록한다.
nid.cbSize = sizeof(nid);
// 아이콘을 로드 한다.
nid.hIcon = LoadIcon( GetModuleHandle(0), MAKEINTRESOURCE(IDI_ICON1) );
// 아이콘의 부모가 될 윈도우 핸들을 정의해 준다.
nid.hWnd = hWnd;
// 아이콘에 마우스가 Mouse over 되었을 경우 출력해줄 ToolTip을 등록한다.
strcpy(nid.szTip, "IconProgram");
// 아이콘 위에서 마우스 클릭등을 통한 메시지가 발생되었을 경우
// 처리할 사용자 정의 메시지를 등록한다.
nid.uCallbackMessage = WM_ICONNOTIFY;
// 트레이 아이콘의 형식을 등록한다.
// 이 정보는 MSDN에 더 자세히 나와 있다.
nid.uFlags = NIF_TIP NIF_MESSAGE NIF_ICON;
// 아이콘의 ID값을 등록한다.
nid.uID = 1;
// 마지막으로 아이콘을 등록 한다.
Shell_NotifyIcon(NIM_ADD, &nid);
return;
} // Notification(HWND hWnd) end.
DWORD WINAPI DialogTray(LPVOID pArg)
{
// 스레드의 인자를 hInstance에 넘겨 받는다.
HINSTANCE hInstance = (HINSTANCE)pArg;
// 다이얼로그 박스를 생성하고 WndDlgTrayProc() 함수를 이용하여 메시지를 처리한다.
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), HWND_DESKTOP, WndDlgTrayProc);
return TRUE;
}
BOOL CALLBACK WndDlgTrayProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
// wPARAM의 상위워드와 하위워드를 나누어 저장한다.
int wmId = LOWORD(wParam);
int wmEvent = HIWORD(wParam);
POINT point;
HMENU hMenu, hSubMenu;
// 다이얼로그창을 숨긴다.
ShowWindow(hDlg, SW_HIDE);
// ※트레이 아이콘 등록 함수※ 에 다이얼로그 핸들을 인자로 넘긴다.
Notification(hDlg);
switch (message)
{
// 1. 트레이 아이콘에 대한 메시지 처리부분
case WM_ICONNOTIFY:
{
switch(lParam)
{
case WM_LBUTTONDOWN:
// 트레이아이콘을 클릭 했을때 행동 처리
break;
case WM_LBUTTONDBLCLK:
// 트레이아이콘을 더블클릭 했을때 행동 처리
break;
case WM_RBUTTONDOWN:
{
// 마우스의 위치를 얻어온다.
GetCursorPos(&point);
// context 메뉴를 띄운다.(메뉴리소스 ID = IDR_MENU1)
hMenu = LoadMenu(GetModuleHandle(0), MAKEINTRESOURCE(IDR_MENU1));
hSubMenu = GetSubMenu(hMenu, 0);
SetMenuDefaultItem(hSubMenu, -1, FALSE);
SetForegroundWindow(hDlg);
TrackPopupMenu(hSubMenu,
TPM_LEFTBUTTONTPM_RIGHTBUTTONTPM_LEFTALIGN,
point.x, point.y, 0, hDlg, NULL);
PostMessage(hDlg, WM_NULL, 0, 0);
DestroyMenu(hMenu);
}
break;
}
}
break;
// 2. Dialog에 대한 명령 처리 부분
case WM_COMMAND:
{
// Dialog의 메뉴 핸들을 가져온다.
hMenu = GetMenu(hDlg);
switch(wmId)
{
case IDM_ABOUT:
// MessageBox(hDlg, "text", "caption", MB_OK MB_ICONINFORMATION);
break;
case IDM_exit:
exit(0);
break;
}
}
break;
default:
return FALSE;
break;
} // switch (message) end.
return FALSE;
} // WndDlgProc() end.
// 트레이 아이콘 USER 메시지 정의
#define WM_ICONNOTIFY (WM_USER + 101)
// 트레이 아이콘을 지원하기 위한 함수
// 작동하는 부분의 HWND를 넘겨줘야 한다.
void Notification(HWND hWnd)
{
// 사용할 트레이 아이콘의 정보를 담은 변수를 선언하여 0으로 초기화 한다.
NOTIFYICONDATA nid = {0};
// 사이즈를 등록한다.
nid.cbSize = sizeof(nid);
// 아이콘을 로드 한다.
nid.hIcon = LoadIcon( GetModuleHandle(0), MAKEINTRESOURCE(IDI_ICON1) );
// 아이콘의 부모가 될 윈도우 핸들을 정의해 준다.
nid.hWnd = hWnd;
// 아이콘에 마우스가 Mouse over 되었을 경우 출력해줄 ToolTip을 등록한다.
strcpy(nid.szTip, "IconProgram");
// 아이콘 위에서 마우스 클릭등을 통한 메시지가 발생되었을 경우
// 처리할 사용자 정의 메시지를 등록한다.
nid.uCallbackMessage = WM_ICONNOTIFY;
// 트레이 아이콘의 형식을 등록한다.
// 이 정보는 MSDN에 더 자세히 나와 있다.
nid.uFlags = NIF_TIP NIF_MESSAGE NIF_ICON;
// 아이콘의 ID값을 등록한다.
nid.uID = 1;
// 마지막으로 아이콘을 등록 한다.
Shell_NotifyIcon(NIM_ADD, &nid);
return;
} // Notification(HWND hWnd) end.
DWORD WINAPI DialogTray(LPVOID pArg)
{
// 스레드의 인자를 hInstance에 넘겨 받는다.
HINSTANCE hInstance = (HINSTANCE)pArg;
// 다이얼로그 박스를 생성하고 WndDlgTrayProc() 함수를 이용하여 메시지를 처리한다.
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), HWND_DESKTOP, WndDlgTrayProc);
return TRUE;
}
BOOL CALLBACK WndDlgTrayProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
// wPARAM의 상위워드와 하위워드를 나누어 저장한다.
int wmId = LOWORD(wParam);
int wmEvent = HIWORD(wParam);
POINT point;
HMENU hMenu, hSubMenu;
// 다이얼로그창을 숨긴다.
ShowWindow(hDlg, SW_HIDE);
// ※트레이 아이콘 등록 함수※ 에 다이얼로그 핸들을 인자로 넘긴다.
Notification(hDlg);
switch (message)
{
// 1. 트레이 아이콘에 대한 메시지 처리부분
case WM_ICONNOTIFY:
{
switch(lParam)
{
case WM_LBUTTONDOWN:
// 트레이아이콘을 클릭 했을때 행동 처리
break;
case WM_LBUTTONDBLCLK:
// 트레이아이콘을 더블클릭 했을때 행동 처리
break;
case WM_RBUTTONDOWN:
{
// 마우스의 위치를 얻어온다.
GetCursorPos(&point);
// context 메뉴를 띄운다.(메뉴리소스 ID = IDR_MENU1)
hMenu = LoadMenu(GetModuleHandle(0), MAKEINTRESOURCE(IDR_MENU1));
hSubMenu = GetSubMenu(hMenu, 0);
SetMenuDefaultItem(hSubMenu, -1, FALSE);
SetForegroundWindow(hDlg);
TrackPopupMenu(hSubMenu,
TPM_LEFTBUTTONTPM_RIGHTBUTTONTPM_LEFTALIGN,
point.x, point.y, 0, hDlg, NULL);
PostMessage(hDlg, WM_NULL, 0, 0);
DestroyMenu(hMenu);
}
break;
}
}
break;
// 2. Dialog에 대한 명령 처리 부분
case WM_COMMAND:
{
// Dialog의 메뉴 핸들을 가져온다.
hMenu = GetMenu(hDlg);
switch(wmId)
{
case IDM_ABOUT:
// MessageBox(hDlg, "text", "caption", MB_OK MB_ICONINFORMATION);
break;
case IDM_exit:
exit(0);
break;
}
}
break;
default:
return FALSE;
break;
} // switch (message) end.
return FALSE;
} // WndDlgProc() end.
덧글을 달아 주세요