[Win32 API] TrayIcon을 이용한 프로그램 만들기 :: Win32 API ::

- 트레이 등록 함수

 void CTeamStatMakerDlg::RegistTrayIcon()
{
    NOTIFYICONDATA  nid;
    nid.cbSize = sizeof(nid);
    nid.hWnd = m_hWnd; // 메인 윈도우 핸들
    nid.uID = IDR_MAINFRAME;  // 아이콘 리소스 ID
    nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; // 플래그 설정
    nid.uCallbackMessage = WM_TRAYICON_MSG; // 콜백메시지 설정
    nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); // 아이콘 로드 

    char strTitle[256];
    GetWindowText(strTitle, sizeof(strTitle)); // 캡션바에 출력된 문자열 얻음
    lstrcpy(nid.szTip, strTitle);
    Shell_NotifyIcon(NIM_ADD, &nid);
    SendMessage(WM_SETICON, (WPARAM)TRUE, (LPARAM)nid.hIcon);
    m_bIsTrayIcon = TRUE; // 트레이 상태 체크 변수
}

 

 

- 사용자 정의 메시지 생성

   여기서 해줄 내용은 트레이 아이콘을 클릭 등 이벤트 발생시 처리 해줄

   기능을 추가 하는 것이다.

 

메시지 선언

#define  WM_TRAYICON_MSG WM_USER + 1

 

메시지맵 셋팅

BEGIN_MESSAGE_MAP(CTeamStatMakerDlg, CDialog)

 //{{AFX_MSG_MAP(CAboutDlg)
 // No message handlers
 //}}AFX_MSG_MAP
 ON_MESSAGE(WM_TRAYICON_MSG, TrayIconMsg)
END_MESSAGE_MAP()

 

메시에 반응할 함수

void CTeamStatMakerDlg::TrayIconMsg(WPARAM wParam, LPARAM lParam)
{
    // 등록된 TrayIcon 클릭하면 Show....
    if(lParam == WM_LBUTTONDBLCLK)
    {  
        ShowWindow(SW_SHOW);
    }
}

 

프로그램 종료시 트레이 관련 자원 해제

if(m_bIsTrayIcon) // 현재 트레이 아이콘으로 설정되었는지 확인 
 {
  NOTIFYICONDATA  nid;
  nid.cbSize = sizeof(nid);
  nid.hWnd = m_hWnd; // 메인 윈도우 핸들
  nid.uID = IDR_MAINFRAME;

  // 작업 표시줄(TaskBar)의 상태 영역에 아이콘을 삭제한다.
  Shell_NotifyIcon(NIM_DELETE, &nid);
 }

이정도면 충분한 프로그램을 개발할수 있을것이지만.

혹시 모라란 부분이 있다면 제가 만든 TratyIcon 프로그램을 보내드릴수도 있으니 필요하면 댓글 날리세요


덧글

  • 좌천 2010/11/03 20:50 # 삭제 답글

    좋은정보 감사합니다..

    그런데 트레이아이콘 잔상은 어떻게 지워야하나요? ㅠㅠ
    종류후에

    마우스 커서를 같다 대야만 없어지더라구요 OTL


    그리고 마우스 우클릭으로 팝업메뉴를 띄우면
    다른 곳 클릭해도 메뉴가 안 없어진더데 이건 어딜손봐야하나요? OTL
  • 푸른나무 2011/01/20 16:17 #

    위 글 마지막 부분에 있는 트레이 관련 자원 해제 부분을 추가하시면 되는데,
    작성 위치를 WM_DESTROY 부분에 작성하시면 될 것 같습니다.
댓글 입력 영역