#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. 
 
2006/05/13 23:22 2006/05/13 23:22

덧글을 달아 주세요