문서번호 | 2014-T-001 |
보존기간 | 3년 |
보고일자 | 2014.03.27(목) |
작성자 | 성 준 영 |
| |
확인 |
Tray Icon
(MFC 대화상자기반)
2014년 3월
Sunmoon Bit 27st | 성 준 영
목 차
1. Tray Icon이란 -------------------------------------------- 3
2. Tray Icon 필요성 ----------------------------------------- 3
3. Tray Icon의 주요 함수와 속성 ------------------------------- 3
4. Tray Icon 사용 예제 --------------------------------------- 5
1. Tray Icon이란?
'시작'버튼이 있는 윈도우 아래 줄을 작업표시줄 이라고 하고, 위에 보이는 작은 아이콘들을 트레이 아이콘(Tray Icon)이라고 부른다.
2. Tray Icon 필요성
백그라운드와 같이 프로그램을 가동할 때 매우 유용하게 사용될 수 있다.
3. Tray Icon의 주요 함수와 속성
BOOL Shell_NotifyIcon(DWORD dwMessage, PNOTIFYICONDATA pnid);
DWORD dwMessage : 요청된 작업을 나타내는 메시지가 전달된다.
|
속성 ID |
내용 |
|
NIM_ADD |
Tray영역에 등록 |
|
NIM_DELETE |
Tray영역에서 제거 |
|
NIM_MODIFY |
등록한 아이콘이나 툴팁 등을 변경한다. |
PNOTIFYICONDATA pnid : pnid 구조체에는 작업에 사용될 정보가 전달된다.
|
NOTIFYICONDATA 구조체 |
구조체 맴버 |
맴버 사용 |
|
|
DWORD cbSize |
구조체 크기 |
|
HWND hWnd |
트레이에 등록된 아이콘에 이벤트가 발생했을 때 관련 메시지를 전달 받을 윈도우 핸들 |
|
|
UINT uID |
작업 표시줄에 표시되는 아이콘 리소스의 ID |
|
|
HICON hIcon |
트레이에 등록할 아이콘의 핸들 |
|
|
UINT uCallbackMessage |
트레이에 어떤 이벤트가 발생했을 때 hWnd 인자로 지정한 윈도우로 전달할 메시지 |
|
|
UINT uFlags |
유요한 멤버 값 명시 |
![]()
![]()
![]()
UINT uFlags의 맴버 사용 지정 목록
|
uFlags |
설명 |
|
NIF_ICON
NIF_MESSAGE
NIF_TIP
NIF_STATE
NIF_INFO |
-hIcon 맴버로 아이콘을 지정한다. LoadIcon 등의 함수로 아이콘 핸들을 얻은 후 이 맴버에 대입한다. -uCallbackMessae로 콜백 메시지를 지정한다. 트레이는 사용자가 아이콘을 클릭할 때 이 메시지를 hWnd로 보낸다. -szTip 맴버로 툴팁을 지정한다. 최대 64자까지 툴팁을 지정해 놓으면 아이콘 위에 마우스 커서가 머무를 때 툴팁이 나타난다. -dwState와 dwStateMask 맴버로 상태를 지정한다.
- 풍선 도움말을 보여준다. szInfo, uTimeout, szInfoTitle, dwInfoFlags 맴버가 사용된다. |
BOOL GetCursorPos(LPPOINT lpPoint)
lpPoint – 전체 화면 기준으로 커서의 좌표를 받아올 POINT구조체의 포인터이다.
트레이의 통지 메시지는 단순히 마우스 버튼이 눌러졌다는 사실만 알려준다. 따라서 마우스 좌표는 전달하지 않으므로 이 함수로 현재 좌표를 조사해서 사용한다.
POINT pt;를 선언하고, GetCursorPos(&pt)로 사용 가능하다.
Pt.x, pt.y 로 위치를 확인 할 수 있다.
4. Tray Icon 사용 예제
MFC 대화상자 기반으로 프로젝트를 생성한다.
트레이 아이콘 생성을 하기 위해 준비해야 하는 과정이 필요하다.
Shell_NotifyIcon에서 사용한 NOTIFYICONDATA구조체 선언 밑 초기화를 해주어야 하며 트레이 아이콘의 행위를 정의하기 위한 사용자 정의 메시지를 만들어야 한다.
헤더파일 안에 NOTIFYICONDATA 구조체를 선언해준다.메뉴도 함께 쓰기 때문에 CMenu m_TrayMenu도 함께 선언해준다.
선언한 구조체를 초기화 후 트레이 아이콘을 생성한다.
BOOL CTray예광탄2Dlg::OnInitDialog(){
nid.cbSize=sizeof(NOTIFYICONDATA); //구조체 사이즈로 설정
nid.hWnd= GetSafeHwnd(); //현재 윈도우핸들을 얻어오는 함수 nid.uID=IDR_MAINFRAME; // 아이콘 ID설정 nid.uFlags=NIF_ICON|NIF_TIP|NIF_MESSAGE; //플래그 설정
nid.hIcon= AfxGetApp()->LoadIcon(IDR_MAINFRAME); lstrcpy(nid.szTip,L"트레이아이콘"); //트레이 아이콘 툴팁 nid.uCallbackMessage = MYWM_NOTIFYICON;;
Shell_NotifyIcon(NIM_ADD,&nid); //트레이 아이콘 생성 m_TrayMenu.LoadMenu(IDR_MENU1); // 미리 만들어 둔 리소스를 메뉴에 추가
…
}
트레이 메뉴 리소스 만들기 (트레이용 메뉴로 간단하게 만들기)
서브메뉴 생성 시 ID 설정하기
Ex) 서브메뉴 SHOW
ID : ID_SHOW
기본
설정 후 실행시키면 트레이에 아이콘이 들어가있는 것이 보일 것이다.
다음은 Tray버튼 클릭 시 또는 윈도우 창을 종료 시켰을 때 실행이 종료가 되는 것이 아니라 트레이로 숨기는 것을
해볼 것이다.
아래와 같이 다이얼로그 메시지에서 WM_CLOSE – OnClose()를 정의한다.
void CTray예광탄2Dlg::OnClose()
{
Shell_NotifyIcon(NIM_ADD,&nid);
ShowWindow(SW_HIDE); //윈도우창을 숨긴다
}
버튼 이벤트에서 버튼클릭이벤트를 정의한다.
void CTray예광탄2Dlg::OnBnClickedButton1()
{
Shell_NotifyIcon(NIM_ADD,&nid);
ShowWindow(SW_HIDE); //윈도우창을 숨긴다
}
다음 과정은 트레이 아이콘의 행위를 정의하기 위한 사용자 메시지 만들기이다.
-사용자 메시지 추가한다.
Tray예광탄2Dlg.cpp
LRESULT CTray예광탄2Dlg::onTrayNotify(WPARAM wParam,LPARAM lParam)
{
switch(lParam)
{
case WM_RBUTTONDOWN: //마우스 오른쪽 클릭시 메뉴 불러오기
{
CPoint ptMouse;
GetCursorPos(&ptMouse);
CMenu *pMenu = m_TrayMenu.GetSubMenu(0);
pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,ptMouse.x,ptMouse.y,AfxGetMainWnd());
} break;
case WM_LBUTTONDBLCLK: //마우스 왼쪽버튼 더블클릭시
{
Shell_NotifyIcon( NIM_DELETE,&nid);
ShowWindow(SW_SHOW); //윈도우창 보이기
} break;
}
}
서브메뉴 선택 시 수행할 메시지 설정하기
Ctrl + Shift + x 단축키로 클래스 마법사 불러오기
메뉴 만들 때 설정해두었던 서브메뉴 ID를 검색하여 COMMAND 메시지 선택 후 처리기를 추가한다. 그 후 적용 – 확인을 한다.
서브메뉴 클릭 시 수행하는 처리기들
void CTray예광탄2Dlg::OnExit()
{
Shell_NotifyIcon(NIM_DELETE,&nid);
exit(0);
}
void CTray예광탄2Dlg::OnShow()
{
ShowWindow(SW_SHOW);
}
void CTray예광탄2Dlg::OnEnable()
{
nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); //활성화 시 아이콘 변경
Shell_NotifyIcon(NIM_MODIFY,&nid);
}
void CTray예광탄2Dlg::OnDisable()
{
nid.hIcon = AfxGetApp()->LoadIcon(IDI_ICON1); // 비활성화 시 아이콘 변경
Shell_NotifyIcon(NIM_MODIFY,&nid);
}
|
실행 초기모습 |
Tray 클릭 시 |
|
|
|
|
오른쪽 클릭 시 |
서브메뉴 비활성화 클릭시 |
|
|
|