프로젝트는 대화 상자 기반으로 해서 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를 반환합니다.
}
트레이 아이콘 상태를 비활성화 상태로 표시한다.
▷ 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