227 lines
6.4 KiB
C++
227 lines
6.4 KiB
C++
// =============================================================================
|
|
// Class Implementation : COXTaskbarIcon
|
|
// =============================================================================
|
|
//
|
|
// Source file : OXTaskbarIcon.cpp
|
|
|
|
// Version: 9.3
|
|
|
|
// This software along with its related components, documentation and files ("The Libraries")
|
|
// is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
|
|
// governed by a software license agreement ("Agreement"). Copies of the Agreement are
|
|
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
|
|
// to obtain this file, or directly from our office. For a copy of the license governing
|
|
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.
|
|
|
|
// //////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "OXTaskbarIcon.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
IMPLEMENT_DYNAMIC(COXTaskbarIcon, CWnd)
|
|
|
|
#define new DEBUG_NEW
|
|
|
|
BEGIN_MESSAGE_MAP(COXTaskbarIcon, CWnd)
|
|
//{{AFX_MSG_MAP(COXTaskbarIcon)
|
|
ON_MESSAGE(WM_NOTIFY_TASKBAR_ICON, OnNotifyTaskbarIcon)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
// Data members -------------------------------------------------------------
|
|
// protected:
|
|
// protected:
|
|
// BOOL m_bShowing; a flag to indicate whether the icon is
|
|
// showing on the taskbar.
|
|
// UINT m_nTaskbarIconID; the identifier of a taskbar icon, will
|
|
// not be altered after calling Create()
|
|
// private:
|
|
|
|
// Member functions ---------------------------------------------------------
|
|
// public:
|
|
|
|
COXTaskbarIcon::COXTaskbarIcon()
|
|
{
|
|
m_bShowing = FALSE;
|
|
}
|
|
|
|
COXTaskbarIcon::~COXTaskbarIcon()
|
|
{
|
|
if (::IsWindow(m_hWnd))
|
|
{
|
|
// ... Create() has been called
|
|
if (IsShowing())
|
|
// ... Delete the icon from taskbar
|
|
Hide();
|
|
::DestroyWindow(m_hWnd);
|
|
}
|
|
}
|
|
|
|
BOOL COXTaskbarIcon::Create(UINT nTaskbarIconID /* = 0 */)
|
|
{
|
|
ASSERT(!::IsWindow(m_hWnd));
|
|
m_nTaskbarIconID = nTaskbarIconID;
|
|
|
|
// create an invisible, less memory consuming, and global window class
|
|
return CWnd::CreateEx(0, AfxRegisterWndClass(CS_CLASSDC | CS_GLOBALCLASS), NULL, 0,
|
|
0, 0, 0, 0, NULL, NULL);
|
|
}
|
|
|
|
void COXTaskbarIcon::SetTooltipText(LPCTSTR lpszString, BOOL bRefresh /* = TRUE */)
|
|
{
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
SetWindowText(lpszString);
|
|
if (IsShowing() && bRefresh)
|
|
Refresh();
|
|
}
|
|
|
|
void COXTaskbarIcon::SetTooltipText(UINT nIDResource, BOOL bRefresh /* = TRUE */)
|
|
{
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
CString sTooltipText;
|
|
VERIFY(sTooltipText.LoadString(nIDResource));
|
|
SetTooltipText(sTooltipText, bRefresh);
|
|
}
|
|
|
|
HICON COXTaskbarIcon::SetIcon(HICON hIcon, BOOL bRefresh /* = TRUE */)
|
|
{
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
ASSERT(hIcon);
|
|
HICON hPrevIcon = CWnd::SetIcon(hIcon, FALSE);
|
|
if (IsShowing() && bRefresh)
|
|
Refresh();
|
|
return hPrevIcon;
|
|
}
|
|
|
|
HICON COXTaskbarIcon::SetIcon(UINT nIDResource, BOOL bRefresh /* = TRUE */)
|
|
{
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
HICON hIcon = ::LoadIcon(AfxFindResourceHandle(MAKEINTRESOURCE(nIDResource),
|
|
RT_GROUP_ICON), MAKEINTRESOURCE(nIDResource));
|
|
ASSERT(hIcon);
|
|
return SetIcon(hIcon, bRefresh);
|
|
}
|
|
|
|
HICON COXTaskbarIcon::SetIcon(LPCTSTR lpszResourceName, BOOL bRefresh /* = TRUE */)
|
|
{
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
HICON hIcon = ::LoadIcon(AfxFindResourceHandle(lpszResourceName,
|
|
RT_GROUP_ICON), lpszResourceName);
|
|
ASSERT(hIcon);
|
|
return SetIcon(hIcon, bRefresh);
|
|
}
|
|
|
|
BOOL COXTaskbarIcon::Show()
|
|
{
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
if (IsShowing())
|
|
{
|
|
TRACE0("COXTaskbarIcon::Show : Warning: Called after icon is showed.\n");
|
|
return FALSE;
|
|
}
|
|
BOOL bSuccess = ShellNotify(NIM_ADD);
|
|
if (bSuccess) m_bShowing = TRUE;
|
|
return bSuccess;
|
|
}
|
|
|
|
BOOL COXTaskbarIcon::Hide()
|
|
{
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
if (!IsShowing())
|
|
{
|
|
TRACE0("COXTaskbarIcon::Hide : Warning: Called before icon is showed.\n");
|
|
return FALSE;
|
|
}
|
|
BOOL bSuccess = ShellNotify(NIM_DELETE);
|
|
if (bSuccess) m_bShowing = FALSE;
|
|
return bSuccess;
|
|
}
|
|
|
|
BOOL COXTaskbarIcon::Refresh()
|
|
{
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
if (!IsShowing())
|
|
{
|
|
TRACE0("COXTaskbarIcon::Refresh : Warning: Called before icon is showed.\n");
|
|
return FALSE;
|
|
}
|
|
return ShellNotify(NIM_MODIFY);
|
|
}
|
|
|
|
void COXTaskbarIcon::GetTooltipText(CString& rString) const
|
|
{
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
GetWindowText(rString);
|
|
}
|
|
|
|
|
|
// protected:
|
|
|
|
BOOL COXTaskbarIcon::ShellNotify(DWORD dwMessage)
|
|
// In: dwMessage, identifier of the message to send, same as Shell_NotifyIcon's dwMessage
|
|
// parameter. This parameter can be one of these values:
|
|
// NIM_ADD Adds an icon to the taskbar notification area.
|
|
// NIM_DELETE Deletes an icon from the taskbar notification area.
|
|
// NIM_MODIFY Modifies an icon in the taskbar notification area.
|
|
// Out:
|
|
// Return: TRUE if successful or FALSE otherwise.
|
|
// Effect: Sends a message to the system to add, modify, or delete a taskbar icon.
|
|
// Similar to Shell_NotifyIcon(WORD dwMessage, PNOTIFYICONDATA pnid), except the
|
|
// PNOTIFYICONDATA struct will be filled return values from member function calls
|
|
// of GetID(), GetIcon(), and GetTooltipText().
|
|
{
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
|
|
NOTIFYICONDATA tnid;
|
|
|
|
tnid.cbSize = sizeof(NOTIFYICONDATA);
|
|
tnid.hWnd = m_hWnd;
|
|
tnid.uID = GetID();
|
|
if (dwMessage != NIM_DELETE)
|
|
{
|
|
tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
|
|
tnid.uCallbackMessage = WM_NOTIFY_TASKBAR_ICON;
|
|
tnid.hIcon = GetIcon();
|
|
GetTooltipText(tnid.szTip, sizeof(tnid.szTip));
|
|
}
|
|
|
|
return Shell_NotifyIcon(dwMessage, &tnid);
|
|
}
|
|
|
|
LRESULT COXTaskbarIcon::OnNotifyTaskbarIcon(WPARAM wParam, LPARAM lParam)
|
|
// In: wParam, contains the identifier of a taskbar icon who sends this message
|
|
// should be the same value as m_nTaskbarIconID
|
|
// lParam, contains the mouse message (within WM_MOUSEFIRST to WM_MOUSELAST)
|
|
// Out:
|
|
// Return: (not used)
|
|
// Effect: this is to handle messages routed by system from the taskbar icon.
|
|
// will continue to route the msg to this taskbar icon's owner if any,
|
|
// or to itself if no owner.
|
|
{
|
|
ASSERT(::IsWindow(m_hWnd));
|
|
CWnd* pOwnerWnd = GetOwner();
|
|
|
|
if (pOwnerWnd)
|
|
{
|
|
// ... if owner window is set, route notifications to it
|
|
ASSERT(::IsWindow(pOwnerWnd->m_hWnd));
|
|
pOwnerWnd->PostMessage(WM_NOTIFY_TASKBAR_ICON, wParam, lParam);
|
|
}
|
|
else
|
|
{
|
|
// ... if not, translate mouse messages for message handlers
|
|
// in derived classes, and post it to myself
|
|
PostMessage((UINT)lParam);
|
|
}
|
|
// ... don't care value
|
|
return -1;
|
|
}
|
|
|
|
// private:
|
|
|
|
// end of OXTaskbarIcon.cpp
|