본문 바로가기
C & C++/MFC 컨트롤

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

by izen8 2011. 3. 27.
반응형

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);
}

반응형

댓글