CAFE

MFC/COM/멀티미디어

[27기 성준영]Tray Icon 기술문서

작성자27기 성준영|작성시간14.03.27|조회수669 목록 댓글 0

첨부파일 [27기 성준영]Tray 기술문서.docx


문서번호

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 클릭 시

오른쪽 클릭 시

서브메뉴 비활성화 클릭시

    


다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼