C & C++/MFC 컨트롤

[Tip] Winamp 처럼 TaskBar와 SystemTray 가지고 놀기

izen8 2011. 3. 27. 17:50

1.요약

윈앰프에서 보면 TaskBar와 SystemTray에 동시에 보여주는 모드 혹은 각각 보여주는 모드 그리고 모두 보여주지 않는 모드가 있습니다. 4가지의 기능을 모두 구현해 보도록 하겠습니다.


2.본문

윈앰프의 기능을 살펴보기 위해서 일단 Spy++로 윈앰프를 선택하신후, 메세지는 WS_SHOWWINDOW 와 WS_STYLECHANGED 만을 선택합니다. 일반적으로 윈도우의 속성일 바뀔때 위의 메세지가 발생합니다. 그리고 나서 속성을 여러번 바꾸어 보면 아래의 표와 같습니다.


TaskBar 를 보여주기 --> WS_EX_TOOLWINDOW 속성(0x0080)을 뺀다.

TaskBar 에서 감춘다 --> WS_EX_TOOLWINDOW 속성(Ox0080)을 넣는다.


SystemTray에서 감춘다 --> SystemTray 의 HideIcon()을 호출한다.

SystemTray에서 보여준다 --> SystemTray의 ShowIcon()을 호출한다.


방법은 간단하고, 핵심은 ToolWindow 속성이 TaskBar에서 Icon을 감춘다는 속성에 있습니다. 아래의 예제를 참고해 보세요.

3.예제

//*****************************************************************************
// CShowOnlyTrayDlg::OnTaskonly()
// Purpose: [ TaskBar에만 보여준다.]
// Parameters:
// Returns: none
//*****************************************************************************
void CShowOnlyTrayDlg::OnTaskonly()
{
   ShowWindow(SW_HIDE);
   SetWindowLong(m_hWnd, GWL_EXSTYLE , 0x0110);
   m_TrayIcon.HideIcon();
   ShowWindow(SW_SHOW);
}

//*****************************************************************************
// CShowOnlyTrayDlg::OnSystemOnly()
// Purpose: [ SystemTray Icon 만 보여준다. ]
// Parameters:
// Returns: none
//*****************************************************************************
void CShowOnlyTrayDlg::OnSystemOnly()
{
   ShowWindow(SW_HIDE);
   SetWindowLong(m_hWnd, GWL_EXSTYLE , 0x0190);
   ShowWindow(SW_SHOW);
   m_TrayIcon.ShowIcon();
}

//*****************************************************************************
// CShowOnlyTrayDlg::OnSystemTaskbar()
// Purpose: [ SystemTray Icon과 TaskBar를 모두 보여준다. ]
// Parameters:
// Returns: none
//*****************************************************************************
void CShowOnlyTrayDlg::OnSystemTaskbar()
{
   ShowWindow(SW_HIDE);
   SetWindowLong(m_hWnd, GWL_EXSTYLE , 0x0110);
   m_TrayIcon.ShowIcon();
   ShowWindow(SW_SHOW);
}

//*****************************************************************************
// CShowOnlyTrayDlg::OnNone()
// Purpose: [ SystemTray Icon 과 TaskBar를 모두 감춘다. ]
// Parameters:
// Returns: none
//*****************************************************************************
void CShowOnlyTrayDlg::OnNone()
{
   ShowWindow(SW_HIDE);
   SetWindowLong(m_hWnd, GWL_EXSTYLE , 0x0190);
   m_TrayIcon.HideIcon();
   ShowWindow(SW_SHOW);
}