Program/C & C++

트레이 아이콘 만들기

너구리V 2011. 7. 29. 09:48

헤더파일에 추가

#define WM_TRAYICON_MSG WM_USER+1
======================================================================================

소스파일에 추가

메세지 맵 추가
BEGIN_MESSAGE_MAP(CSChatSvrDlg, CDialog)
 //{{AFX_MSG_MAP(CSChatSvrDlg)
 ON_WM_SYSCOMMAND()
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 ON_BN_CLICKED(IDC_ACTIVATE, OnActivate)
 ON_WM_DESTROY()
 ON_WM_CLOSE()
 //}}AFX_MSG_MAP
 ON_MESSAGE(WM_TRAYICON_MSG, TrayIconMsg)
END_MESSAGE_MAP()

트레이 등록 함수
void CSChatSvrDlg::RegistTrayIcon()
{
 NOTIFYICONDATA nid;

 nid.cbSize = sizeof(nid);
 nid.hWnd = m_hWnd;   // 메인 윈도우 핸들
 nid.uID = IDI_ICON1; //아이콘 리소스 ID
 nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; // 플래그 설정
 nid.uCallbackMessage = WM_TRAYICON_MSG;  // 콜백메시지 설정
 nid.hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);  //아이콘 로드
 
 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_blsTrayIcon = TRUE; // 트레이 상태 체크 변수
}

메시지에 반응 할 함수
void CSChatSvrDlg::TrayIconMsg(WPARAM wParam, LPARAM lParam)
{
 // 등록된 TrayIcon 클릭하면 Show..
 if(lParam == WM_LBUTTONDBLCLK)
 {
  ShowWindow(SW_SHOW);
 }
}

프로그램 종료시 트레이 관련 자원 해제
 if(m_blsTrayIcon)  // 현재 트레이 아이콘으로 설정되었는지 확인
 {
  NOTIFYICONDATA nid;
  nid.cbSize = sizeof(nid);
  nid.hWnd = m_hWnd; // 메인 윈도우 핸들
  nid.uID = IDI_ICON1;
  // 작업 표시줄(TaskBar)의 상태 영역에 아이콘을 삭제한다.
  Shell_NotifyIcon(NIM_DELETE, &nid);
 }


반응형