티스토리 뷰
1. 프로젝트 생성
- 형식 : MFC 응용프로그램
- 이름 : TrayIcon
- 응용프로그램 종류 : 대화상자 기반 (Dialog based)
2. 프로젝트 생성 후, 리소스 뷰의 아이콘 중 IDR_MAINFRAME을 자신이 원하는 모양으로 바꿔준다
3. 솔루션 뷰의 헤더파일 중 stdafx.h 파일의 아랫쪽 부분에 다음을 입력
(include 작업의 뒤쪽에 해 주는 것이 좋다.)
이것이 바로 사용자 정의 윈도우 메시지의 설정.(9번과 10번 과정을 꼭 해야함)
#define WM_DIALOG_SHOWWM_USER + 101 //다이얼로그감추기/보이기
#define WM_APP_EXIT WM_USER + 102 //다이얼로그종료
#define WM_TRAYICON WM_USER + 103 //트레이아이콘메시지
4. CTrayIconMng 클래스를 추가한다. 기본 클래스는 Cobject.
5. 그리고 CTrayIconMng 클래스의 멤버변수와 함수를 추가 해 준다.
// 트레이아이콘이생성되었는지여부 (True : 생성됨)
bool m_bAdded;
// 다이얼로그가감춰진상태인지여부 (True : 숨겨짐)
bool m_bHide;
// 팝업메뉴생성
void MakePopupMenu(HWND hWnd, int x, int y);
// 팝업메뉴의이벤트발생시처리함수
void ProcTrayMsg(HWND hWnd, WPARAM wParam, LPARAM lParam);
// 트레이아이콘생성
BOOL AddTrayIcon(HWND hWnd);
// 트레이아이콘제거
BOOL DelTrayIcon(HWND hWnd);
6. CTrayIconMng 클래스의 멤버함수 코드들을 다음과 같이 각각 작성한다.
// 팝업메뉴생성
void CTrayIconMng::MakePopupMenu(HWND hWnd, int x, int y)
{
//팝업메뉴를생성하고메뉴구성
HMENU hMenu = CreatePopupMenu();
if(m_bHide) //다이얼로그가감춰진상태라면
AppendMenu(hMenu, MF_STRING, WM_DIALOG_SHOW, _T("다이얼로그보이기"));
else //다이얼로그가숨겨진상태라면
AppendMenu(hMenu, MF_STRING, WM_DIALOG_SHOW, _T("다이얼로그감추기"));
AppendMenu(hMenu, MF_STRING, WM_APP_EXIT, _T("종료"));
SetForegroundWindow(hWnd);//생성된팝업메뉴밖을클릭할때팝업닫기
//팝업메뉴띄우기
TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, x, y, 0, hWnd, NULL);
}
// 팝업메뉴의이벤트발생시처리함수
void CTrayIconMng::ProcTrayMsg(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
HMENU hMenu = NULL;
POINT pos;
if(lParam == WM_LBUTTONDOWN)
{
GetCursorPos(&pos);
MakePopupMenu(hWnd, pos.x, pos.y); //팝업메뉴생성및출력
}
}
// 트레이아이콘생성
BOOL CTrayIconMng::AddTrayIcon(HWND hWnd)
{
if(m_bAdded) //이미트레이아이콘이있다면종료
return FALSE;
NOTIFYICONDATA nid; //아이콘을생성하여설정
ZeroMemory(&nid, sizeof(NOTIFYICONDATA));
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nid.uCallbackMessage = WM_TRAYICON;
//sprintf((char*)nid.szTip, (char*)_T("TrayTest"));
lstrcpy(nid.szTip, "TrayTest"); // tool tip 메세지
nid.uID = 0;
nid.hIcon = theApp.LoadIcon(IDR_MAINFRAME);
if(Shell_NotifyIcon(NIM_ADD, &nid)==0) //트레이아이콘표시
return FALSE;
m_bAdded = true;
return TRUE;
}
// 트레이아이콘제거
BOOL CTrayIconMng::DelTrayIcon(HWND hWnd)
{
NOTIFYICONDATA nid;
ZeroMemory(&nid, sizeof(NOTIFYICONDATA));
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uFlags = NULL;
if(Shell_NotifyIcon(NIM_DELETE, &nid)==0) //트레이아이콘삭제
return FALSE;
return TRUE;
}
7. CTrayIconDlg 에 멤버 변수 및 함수 추가
// 트레이아이콘관리용객체
CTrayIconMng m_myTray;
// 트레이아이콘보이기/숨기기여부
bool m_bHide;
long OnTrayIcon(WPARAM wParam, LPARAM lParam);
void OnAppExit(void);
void OnDialogShow(void);
8. CTrayIconDlg 의 OnInitDialog() 함수의 마지막부분에 다음을 추가하여 프로그램이 시작됨과 동시에 트레이아이콘을 추가하게끔 함
m_myTray.m_bHide = m_bHide;
m_myTray.AddTrayIcon(GetSafeHwnd());
return TRUE; // 컨트롤에 대한 포커스를 설정하지 않을 경우 TRUE를 반환합니다.
9. CTrayIconDlg 에 다음의 함수를 추가 : 이들은 사용자 메시지 핸들러 역할을 한다
long OnTrayIcon(WPARAM wParam, LPARAM lParam);
void OnAppExit();
void OnToggleShow();
10. CTrayIconDlg의 메시지 맵에서 사용자 메시지 핸들러와 연결을 시켜준다
BEGIN_MESSAGE_MAP(CMyMessengerDlg, CDialog)
…
ON_MESSAGE(WM_TRAYICON, OnTrayIcon)
ON_COMMAND(WM_APP_EXIT, OnAppExit)
ON_COMMAND(WM_DIALOG_SHOW, OnDialogShow)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
11. CTrayIconDlg 클래스의 함수들을 다음과 같이 지정 해 준다.
(이때, .cpp 파일에 #include "TrayIconMng.h" 가 포함되어야 한다)
//트레이아이콘을클릭했을때의메시지핸들러
long CTrayIconDlg::OnTrayIcon(WPARAM wParam, LPARAM lParam)
{
m_myTray.ProcTrayMsg(GetSafeHwnd(), wParam, lParam);
return 0;
}
//트레이아이콘팝업메뉴의종료메뉴메시지핸들러
void CTrayIconDlg::OnAppExit(void)
{
m_myTray.DelTrayIcon(GetSafeHwnd());
CDialog::OnCancel();
}
//트레이아이콘보이기/숨기기메뉴메시지핸들러
void CTrayIconDlg::OnDialogShow(void)
{
if(!m_bHide) ShowWindow(false); //보이는상태라면숨기고
else ShowWindow(true); //숨겨진상태라면보이게
m_bHide = !m_bHide;
m_myTray.m_bHide = m_bHide;
}
12. 컴파일 및 실행
'Computer > MFC' 카테고리의 다른 글
[MFC] 윈도우 핸들( HWND ) 얻기 (0) | 2013.07.10 |
---|---|
MFC Thread 사용 (AfxbeginThread) (0) | 2013.07.09 |
MFC 프로그램 배포용으로 생성하기 (0) | 2013.07.08 |
CString 사용 예제 (0) | 2013.07.06 |
MFC로 프로그래밍 하면서 printf 함수를 사용 (0) | 2013.07.05 |