2025-11-27 16:46:48 +09:00

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