본문 바로가기

업무 채널

[MFC] 트레이 아이콘 (Tray Icon) 등록하기

1. 트레이 아이콘이란?

 

 

위에 보이는 작은 아이콘들을 트레이 아이콘(Tray Icon)이라고 부른다.

트레이 아이콘은 하나의 응용프로그램을 대표하면서도 적은 공간을 차지하기 때문에 매우 유용하다. 백그라운드와 같이 프로그램을 가동시킬때 매우 유용하게 사용될수 있다.

 

 

2. 트레이 아이콘 생성 예제

 

자 그럼 트레이 아이콘을 생성 예제를 살펴보자.

 

 

2-1) 트레이아이콘 생성

트레이 아이콘을 생성할 곳에 (특정키나 버튼 입력시 혹은 프로그램 초기화시) 다음 소스를 작성한다.

 

NOTIFYICONDATA nid;
ZeroMemory(&nid, sizeof(nid));
nid.cbSize = sizeof(nid);
nid.uID = 0;
nid.hWnd = m_pMainWnd->GetSafeHwnd();

nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
lstrcpy(nid.szTip, "HotKey Control");
nid.uCallbackMessage = WM_TRAY_NOTIFICATION;

BOOL bRet = ::Shell_NotifyIcon(NIM_ADD,&nid); //트레이 아이콘 등록
AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE); //윈도우 감추기

 

Shell_NotifyIcon에서 사용한 NOTIFYICONDATA구조체 선언 밑 초기화를 해준다.
nid.uFlags는 NIF_ICON | NIF_TIP | NIF_MESSAGE등의 아이콘, 툴팁, 메시지 사용을 지정하고 있다.

nid.hIcon은 App의 아이콘을 로드한다.

nid.szTip은 툴팁으로 나올 문자열을 담는다.
nid.uCallbackMessage는 사용자 지정 메시지인 WM_TRAY_NOTIFICATION으로 지정한다.
::Shell_NotifyIcon에 NIM_ADD(아이콘 추가)속성을 지정하고, 설정한 NOTIFYICONDATA구조체 정보를 넘긴다.

 


2-2) 사용자 메시지 추가하여 트레이아이콘 클릭이벤트 생성하기

 

[CMainFrame.h]

 afx_msg LRESULT OnTrayNotification(WPARAM, LPARAM);

 

[CMainFrame.cpp]

 

#define WM_TRAY_NOTIFICATION WM_APP + 1

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_MESSAGE(WM_TRAY_NOTIFICATION, OnTrayNotification)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

 

LRESULT CMainFrame::OnTrayNotification(WPARAM wParam, LPARAM lParam)
{
switch(lParam)
{
case WM_RBUTTONDOWN:
{
CPoint ptMouse;
::GetCursorPos(&ptMouse);

CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);
CMenu *pMenu = menu.GetSubMenu(0); //활성화 할 메뉴 지정
pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
ptMouse.x, ptMouse.y, AfxGetMainWnd());
}
break;

case WM_LBUTTONDBLCLK:
{
NOTIFYICONDATA nid;
ZeroMemory(&nid, sizeof(nid));
nid.cbSize = sizeof(nid);
nid.uID = 0;
nid.hWnd = GetSafeHwnd();

BOOL bRet = ::Shell_NotifyIcon(NIM_DELETE, &nid); //트레이아이콘 제거
if(!bRet)
{
AfxMessageBox("트레이 아이콘 제거 실패");
return -1;
}
AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW); //윈도우 활성화
}
break;
}
return 1;
}

 

WM_RBUTTONDOWN 메시지는 현재의 커서 위치를 알아와 트레이 아이콘 위에서 이벤트가 일어날 경우 생성되어 있는 메뉴의 첫번째 인덱스 메뉴를 활성화 시킨다.

WM_LBUTTONDBLCLK 메시지는 트레이 아이콘의 uID를 지정하고 핸들을 얻어와 더블클릭시 트레이아이콘을 제거하고 윈도우를 활성화 시켜준다.

 

우클릭시 나타나는 메뉴의 수정은 리소스뷰 - Menu - IDR_MAINFRAME에서 수정가능하다.

이상으로 트레이 아이콘 생성하기 포스팅을 마친다.