www.pudn.com > mu_explorer.rar > BBSystemTray.cpp


// BBSystemTray.cpp: implementation of the CBBSystemTray class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "BBSystemTray.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
 
IMPLEMENT_DYNAMIC(CBBSystemTray, CWnd) 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CBBSystemTray::CBBSystemTray() 
{ 
	Init(); 
} 
 
 
BOOL CBBSystemTray::Create(CWnd* pParent, UINT uCallbackMessage, LPCTSTR szToolTipText, HICON hIcon, UINT uMenuID) 
{ 
         
    // 自定义消息是否大于WM_USER 
    ASSERT(uCallbackMessage >= WM_USER); 
 
    //检查提示字符是否大于64个字符,因为提示信息不允许大于64字符 
    ASSERT(_tcslen(szToolTipText) <= 64);     
	CWnd::CreateEx(0, AfxRegisterWndClass(0), 
			_T(""), WS_POPUP, 0,0,10,10, NULL, 0);     
    m_tnd.cbSize = sizeof(NOTIFYICONDATA); 
    m_tnd.hWnd   = pParent->GetSafeHwnd()? pParent->GetSafeHwnd() : m_hWnd; 
    m_tnd.uID    = uMenuID; 
    m_tnd.hIcon  = hIcon; 
    m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 
    m_tnd.uCallbackMessage = uCallbackMessage; 
    _tcscpy(m_tnd.szTip, szToolTipText); 
 
    //设置图标 
	 
    VERIFY(m_bAdded =Shell_NotifyIcon(NIM_ADD, &m_tnd));	 
    return m_bAdded; 
} 
 
BOOL CBBSystemTray::Create(LPCTSTR szToolTipText, HICON hIcon, UINT uMenuID) 
{ 
	return Create(NULL,WM_DEFAULT_NOTIFY_MESSAGE,szToolTipText,hIcon,uMenuID); 
} 
 
//初始化 
BOOL CBBSystemTray::Init() 
{ 
	m_bAdded=FALSE; 
    memset(&m_tnd, 0, sizeof(m_tnd)); 
    m_nDefaultMenuItemID = 0; 
    m_bDefaultMenuItemByPos = TRUE; 
	return TRUE; 
} 
 
CBBSystemTray::~CBBSystemTray() 
{ 
	//删除图标 
    RemoveIcon();     
} 
 
 
void CBBSystemTray::RemoveIcon() 
{ 
	ASSERT(m_bAdded); 
	if (!m_bAdded)  
		return; 
    m_tnd.uFlags = 0; 
    Shell_NotifyIcon(NIM_DELETE, &m_tnd);     
} 
 
//改变图标 
BOOL CBBSystemTray::SetIcon(HICON hIcon) 
{ 
	ASSERT(m_bAdded); 
	if (!m_bAdded)  
		return FALSE; 
	 
	m_tnd.uFlags = NIF_ICON; 
	m_tnd.hIcon = hIcon; 
	return Shell_NotifyIcon(NIM_MODIFY, &m_tnd); 
	 
} 
 
BOOL CBBSystemTray::SetIcon(UINT nIDResource) 
{ 
    HICON hIcon = AfxGetApp()->LoadIcon(nIDResource); 
    return SetIcon(hIcon); 
} 
  
HICON CBBSystemTray::GetIcon() const 
{	 
    return m_bAdded?m_tnd.hIcon:NULL; 
} 
 
//修改提示 
BOOL CBBSystemTray::SetTooltipText(LPCTSTR pszTip) 
{ 
    m_tnd.uFlags = NIF_TIP; 
    _tcscpy(m_tnd.szTip, pszTip); 
    return Shell_NotifyIcon(NIM_MODIFY, &m_tnd); 
} 
 
//得到当前提示 
CString CBBSystemTray::GetTooltipText() const 
{ 
	ASSERT(m_bAdded); 
	if(m_bAdded) 
	{ 
		CString strText; 
		strText = m_tnd.szTip; 
		return strText; 
	} 
	else 
	{ 
		return ""; 
	} 
} 
 
 
//设置消息的处理Notify窗口 
BOOL CBBSystemTray::SetNotificationWnd(CWnd* pWnd) 
{ 
	ASSERT(m_bAdded); 
	if(!m_bAdded) 
		return FALSE; 
    ASSERT(pWnd && ::IsWindow(pWnd->GetSafeHwnd())); 
    m_tnd.hWnd = pWnd->GetSafeHwnd(); 
    m_tnd.uFlags = 0; 
    return Shell_NotifyIcon(NIM_MODIFY, &m_tnd); 
} 
 
CWnd* CBBSystemTray::GetNotificationWnd() const 
{ 
    return CWnd::FromHandle(m_tnd.hWnd); 
} 
 
//设置默认的菜单项(双击图标打开),bByPos为TRUE表示从位置上的序号,否则以菜单ID为第一参数 
BOOL CBBSystemTray::SetMenuDefaultItem(UINT uItem, BOOL bByPos) 
{ 
    if ((m_nDefaultMenuItemID == uItem) && (m_bDefaultMenuItemByPos == bByPos))  
        return TRUE; 
 
    m_nDefaultMenuItemID = uItem; 
    m_bDefaultMenuItemByPos = bByPos;    
 
    CMenu menu, *pSubMenu; 
 
    if (!menu.LoadMenu(m_tnd.uID)) return FALSE; 
    if (!(pSubMenu = menu.GetSubMenu(0))) return FALSE; 
 
    ::SetMenuDefaultItem(pSubMenu->m_hMenu, m_nDefaultMenuItemID, m_bDefaultMenuItemByPos); 
 
    return TRUE; 
} 
 
void CBBSystemTray::GetMenuDefaultItem(UINT& uItem, BOOL& bByPos) 
{ 
    uItem = m_nDefaultMenuItemID; 
    bByPos = m_bDefaultMenuItemByPos; 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CBBSystemTray message handlers 
 
BEGIN_MESSAGE_MAP(CBBSystemTray, CWnd) 
	//{{AFX_MSG_MAP(CBBSystemTray) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
 
//该函数是默认的消息处理函数,如有需要改变默认的操作,可以重载该函数 
LRESULT CBBSystemTray::OnTrayNotification(WPARAM wParam, LPARAM lParam)  
{ 
    //检查ID是否一样,是否本实例 
    if (wParam != m_tnd.uID) 
        return 0L; 
 
    CMenu menu, *pSubMenu; 
    CWnd* pTarget = AfxGetMainWnd(); 
 
    //处理右键,显示菜单 
    if (LOWORD(lParam) == WM_RBUTTONUP) 
    {     
        if (!menu.LoadMenu(m_tnd.uID)) return 0; 
        if (!(pSubMenu = menu.GetSubMenu(0))) return 0; 
 
        //设置默认的菜单项(加粗) 
        ::SetMenuDefaultItem(pSubMenu->m_hMenu, m_nDefaultMenuItemID, m_bDefaultMenuItemByPos); 
 
        //显示菜单 
        CPoint pos; 
        GetCursorPos(&pos); 
 
		//窗口置前,使其活动 
        pTarget->SetForegroundWindow();   
		::TrackPopupMenu(pSubMenu->m_hMenu, 0, pos.x, pos.y, 0,  
                         pTarget->GetSafeHwnd(), NULL); 
 
        //不知怎么样,需要调用下面的函数,就没有问题 
        pTarget->PostMessage(WM_NULL, 0, 0); 
        menu.DestroyMenu(); 
    }  
    else if (LOWORD(lParam) == WM_LBUTTONDBLCLK)  
    { 
        //处理双击--执行默认的菜单操作 
        pTarget->SetForegroundWindow();   
        UINT uItem; 
		//获得默认菜单 
        if (m_bDefaultMenuItemByPos) 
        { 
            if (!menu.LoadMenu(m_tnd.uID)) return 0; 
            if (!(pSubMenu = menu.GetSubMenu(0))) return 0; 
            uItem = pSubMenu->GetMenuItemID(m_nDefaultMenuItemID); 
        } 
        else 
            uItem = m_nDefaultMenuItemID;         
		//处理菜单的消息 
        pTarget->SendMessage(WM_COMMAND, uItem, 0); 
        menu.DestroyMenu(); 
    } 
    return 1; 
} 
 
LRESULT CBBSystemTray::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)  
{ 
	//处理消息Notify操作 
    if (message == m_tnd.uCallbackMessage) 
        return OnTrayNotification(wParam, lParam); 
	 
	return CWnd::WindowProc(message, wParam, lParam); 
}