요즘 수많은 프로그램들이 Tray Icon을 지원하고 있다.
Tray Icon의 장점은 무엇보다 작업 표시줄을 점유 안한다는 것과 신경이 안쓰인다는 점?
보통 오디오 플레이어나 백신 같이 백그라운드에서 작업 하는 프로그램들이 자주 사용 하는 방식이다.
Tray Icon 기능이라는 것이 윈도우에서 자체적으로 지원하는 것이 아니라, 몇몇 코드들을 수작업으로 작성을 해줘야 한다.특히 Tray Icon 간의 통신 메시지는 정의되어있지 않기 때문에 USER MESSAGE를 따로 정의해줘야 한다.
#define WM_TRAYNOTIFY (WM_APP+100)
NOTIFYICONDATA TrayIconData;
TrayIconData. cbSize = sizeof(NOTIFYICONDATA);
TrayIconData. hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, 0);
TrayIconData. hWnd = GetSafeHwnd();
lstrcpy(TrayIconData. szTip, (LPTSTR)(LPCTSTR)_T("Hello World"));
TrayIconData. uCallbackMessage = WM_TRAYNOTIFY;
TrayIconData. uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
TrayIconData. uID = (UINT) IDR_MAINFRAME;
Shell_NotifyIcon(NIM_ADD, &TrayIconData);
NOTIFYICONDATA TrayIconData;
TrayIconData. cbSize = sizeof(NOTIFYICONDATA);
TrayIconData. hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, 0);
TrayIconData. hWnd = GetSafeHwnd();
lstrcpy(TrayIconData. szTip, (LPTSTR)(LPCTSTR)_T("Hello World"));
TrayIconData. uCallbackMessage = WM_TRAYNOTIFY;
TrayIconData. uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
TrayIconData. uID = (UINT) IDR_MAINFRAME;
Shell_NotifyIcon(NIM_ADD, &TrayIconData);
여기까지가 Tray Icon 등록 코드들이다.
이후에는 Tray Icon 간의 통신이나 필요한 기능들을(Tray Icon을 마우스 오른쪽 클릭했을때 메뉴를 팝업시킨다든지), 넣어주면된다. Tray Icon 간의 통신은 윗 줄에 정의한 USER MESSAGE를 이용해 사용하면 된다.
case WM_TRAYNOTIFY:
switch(lParam)
{
case WM_LBUTTONDBLCLK:
ShowWindow(SW_SHOWMINIMIZED);
ShowWindow(SW_RESTORE);
break;
}
switch(lParam)
{
case WM_LBUTTONDBLCLK:
ShowWindow(SW_SHOWMINIMIZED);
ShowWindow(SW_RESTORE);
break;
}
그리고 프로그램이 종료되더라도, Tray Icon이 남는데, 이것은 윈도우가 닫힐 때, Tray Icon 해제를 안해줘서 그런거다.
윈도우가 닫힐 때는 메세지를 받아 Shell_NotifyIcon(NIM_DELETE, &TrayIconData) 를 호출 해주면 Tray Icon도 같이 해제된다.