프로젝트는 대화 상자 기반으로 해서 TrayIcon 이름으로 Visual Studio 2005 기반에서 만들었습니다.


위의 그림에서 빨간색으로 밑줄친 CTrayIconDig 클래스의 메서드와 멤버변수를 수정해주시면 됩니다.

1. TrayIconDlg.h 헤더파일 수정
     

#define  WM_TRAYICON_MSG WM_USER + 1 삽입해준다.

2. m_bTrayStatus 멤버변수 선언
     

m_bTrayStatus 멤버변수는 트레이아이콘이 활성화 되어있는지를 확인하기 위한 체크변수입니다.
<TrayIconDlg.h>

protected:
    bool m_bTrayStatus;
3. OnInitDialog 수정
     
<TrayIconDlg.cpp>

BOOL CTrayIconDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.

    // IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
    //  프레임워크가 이 작업을 자동으로 수행합니다.
    SetIcon(m_hIcon, TRUE);            // 큰 아이콘을 설정합니다.
    SetIcon(m_hIcon, FALSE);        // 작은 아이콘을 설정합니다.

    // TODO: 여기에 추가 초기화 작업을 추가합니다.
    m_bTrayStatus = false;
    TraySetting();

    return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}
▷ m_bTrayStatus = false;
트레이 아이콘 상태를 비활성화 상태로 표시한다.
TraySetting();
트레이 아이콘 세팅을 한다.
< NOTIFYICONDATA 구조체 >

BOOL WINAPI Shell_NontifyIcon(DWORD dwMessage, PNOTIFYICONDATA pnid);

    * dwMessage로는 다음과 같은 값을 입력할 수 있습니다.
      NIM_ADD : 트레이에 새로운 아이콘 추가
    * NIM_DELETE : 트레이 영역의 아이콘 제거
    * NIM_MODIFY : 트레이 영역에 있는 아이콘 수정

typedef struct _NOTIFYICONDATA
{
    DWORD    cbSize;
    HWND    hWnd;
    UINT    uID;
    UINT    uFlags;
    UINT    uCallbackMessage;
    HICON    hIcon;
    char    szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;

    * cbSize: 구조체의 크기
    * hWnd: 윈도우 핸들
    * uID: 아이콘 식별자, 호출한 애플리케이션의 아이콘을 다른것과 구별해서 식별할수 있게 해주는 사용자 정의값
    * uFlags: NIF_MESSAGE : uCallbackMessage 사용 NIF_ICON : hIcon 사용 NIF_TIP : szTip 사용
    * uCallbackMessage: 아이콘이 hWnd윈도우와 통신하기 위해서 사용할 메시지 ID. 메시지는 WM_APP의 오프셋으로 선언되는 사용자 정의 메시지이다.
    * hIcon: 화면에 그릴 아이콘의 핸들.
    * szTip: 아이콘의 툴팁을 위한 텍스트.
4. TraySetting 메서드를 작성한다.
     
<TrayIconDlg.h>

public:
    void TraySetting(void);
<TrayIconDlg.cpp>

void CTrayIconDlg::TraySetting(void)
{
    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_bTrayStatus = true;
}
5. OnSysCommand 수정한다.
   

<TrayIconDlg.cpp>

void CTrayIconDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else if( nID == SC_MINIMIZE )
    {
        ShowWindow(SW_HIDE);
    }
    else
    {
        CDialog::OnSysCommand(nID, lParam);
    }
}
최소화 버튼을 클릭하면 트레이아이콘으로 되도록 설정하는 부분입니다.


리소스 뷰 → Dialog IDD_TRAYICON_DIALOG 이동하여 Minimize Box 을 True 값으로 바꾼다.
다이얼로그에 최소화 버튼을 추가하는 부분입니다.

6. BEGIN_MESSAGE_MAP 을 수정한다.
     
<TrayIconDlg.cpp>

BEGIN_MESSAGE_MAP(CTrayIconDlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_MESSAGE(WM_TRAYICON_MSG, TrayIconMessage)
    ON_WM_DESTROY()
END_MESSAGE_MAP()

ON_MESSAGE(WM_TRAYICON_MSG, TrayIconMessage) 을 추가한다.

7. TrayIconMessage 메서드를 작성한다.
     
<TrayIconDlg.h>

protected:
    LRESULT TrayIconMessage(WPARAM wParam, LPARAM lParam);
<TrayIconDlg.cpp>

LRESULT CTrayIconDlg::TrayIconMessage(WPARAM wParam, LPARAM lParam)
{
    // 등록된 트레이 아이콘을 클릭하면 다이얼로그를 볼수있게 한다.
    if(lParam == WM_LBUTTONDBLCLK) {
        ShowWindow(SW_SHOW);
    }
    return 0L;
}
8. OnDestroy 수정한다.
     
<TrayIconDlg.cpp>

void CTrayIconDlg::OnDestroy()
{
    CDialog::OnDestroy();

    // TODO: 여기에 메시지 처리기 코드를 추가합니다.
    if(m_bTrayStatus) {
        NOTIFYICONDATA  nid;
        nid.cbSize = sizeof(nid);
        nid.hWnd = m_hWnd; // 메인 윈도우 핸들
        nid.uID = IDR_MAINFRAME;
        // 작업 표시줄(TaskBar)의 상태 영역에 아이콘을 삭제한다.
        Shell_NotifyIcon(NIM_DELETE, &nid);
    }
}
다이얼로그를 종료할때 트레이 아이콘이 있으면 트레이아이콘을 삭제해야합니다.

TrayIconDlg.cpp  [ 다운로드 ]
TrayIconDlg.h  [ 다운로드 ]

야이노마

» Contact Me: yainoma00@gmail.com