托盘CTrayNotify类
NIM_DELETE 删除任务栏通知区的图标;
NIM_MODIFY 更改任务栏通知区的图标、回调消息标志、回调窗口句柄或提示字串;
回调信息的获得及处理
通过这种方式,系统通知应用程序用户对图标的操作。如果一个应用程序生成了两个以上的图标,那么你可以根据wParam来判断是哪个图标返回的鼠标操作。通常,标准的Win95任务栏图标有以下鼠标操作响应:
当鼠标停留在图标上时,系统应显示提示信息tooltip;
当使用鼠标右键单击图标时,应用程序应显示快捷菜单;
当使用鼠标左键双击图标时,应用程序应执行快捷菜单的缺省菜单项。
在Microsoft Windows环境中,0x8000到0xBFFF的消息是保留的,应用程序可以定义自定义消息
头文件
#ifndef _TRAYNOTIFY_H_
#define _TRAYNOTIFY_H_
class CTrayNotify
{
public:
CTrayNotify();
virtual ~CTrayNotify();
//设置和得到图标
void SetIcon(const HICON hIcon,BOOL bEnable=TRUE);
HICON GetIcon() const;
//设置和得到消息
void SetMsg(UINT uMsg,BOOL bEnable=TRUE);
UINT GetMsg();
//设置和得到提示
void SetTip(const char *szTip,BOOL bEnable=TRUE);
void GetTip(char* szTip,UINT uTxtLen) const;
//设置和得到关联的窗口句柄
BOOL SetHwnd(const HWND hWnd);
HWND GetHwnd() const;
//设置和得到ID号
void SetID(const UINT uID);
UINT GetID() const;
//设置和得到uFlags
void SetFlag(UINT uFlag);
UINT GetFlag() const;
//当用调用过SetIcon之类的函数后,不会立即更新,而必须调用此函数更新
BOOL Refresh();
//控制图标是否可见
BOOL ShowIcon(BOOL bShow);
//修改并更新
BOOL Modify(const NOTIFYICONDATA& nid);
//得到NOTIFYICONDATA数据结构
void GetNid(NOTIFYICONDATA* pNid) const;
//图标是否可见
BOOL IsIconShow() const;
//去掉图标,并将NOTIFYICONDATA结构清零
void Reset();
protected:
BOOL m_bShow;
NOTIFYICONDATA m_nid;
private:
};
#endif
实现代码
#include <Windows.h>
#include "TrayNotify.h"
//由于该类实现比较简单,很多东西在MSDN中一查便知,所以也就不在此多加注释
/*---------------------------------------------------------------------------------
*/
CTrayNotify::CTrayNotify()
{
memset((void*)&m_nid,0,sizeof(m_nid));
m_nid.cbSize=sizeof(m_nid);
m_bShow=FALSE;
}
/*---------------------------------------------------------------------------------
*/
CTrayNotify::~CTrayNotify()
{
ShowIcon(FALSE);
}
/*---------------------------------------------------------------------------------
*/
void CTrayNotify::SetIcon(const HICON hIcon,BOOL bEnable)
{
m_nid.hIcon=hIcon;
if(bEnable)
m_nid.uFlags|=NIF_ICON;
}
/*---------------------------------------------------------------------------------
*/
HICON CTrayNotify::GetIcon() const
{
return m_nid.hIcon;
}
/*---------------------------------------------------------------------------------
*/
void CTrayNotify::SetMsg(UINT uMsg,BOOL bEnable)
{
m_nid.uCallbackMessage=uMsg;
if(bEnable)
m_nid.uFlags|=NIF_MESSAGE;
}
/*---------------------------------------------------------------------------------
*/
UINT CTrayNotify::GetMsg()
{
return m_nid.uCallbackMessage;
}
/*---------------------------------------------------------------------------------
*/
void CTrayNotify::SetTip(const char *szTip,BOOL bEnable)
{
lstrcpyn(m_nid.szTip,szTip,sizeof(m_nid.szTip));
if(bEnable)
m_nid.uFlags|=NIF_TIP;
}
/*---------------------------------------------------------------------------------
*/
void CTrayNotify::GetTip(char *szTip,UINT uTxtLen) const
{
lstrcpyn(szTip,m_nid.szTip,uTxtLen);
}
/*---------------------------------------------------------------------------------
*/
BOOL CTrayNotify::SetHwnd(const HWND hWnd)
{
BOOL bRet=TRUE;
if(IsWindow(hWnd))
{
m_nid.hWnd=hWnd;
}
else
bRet=FALSE;
return bRet;
}
/*---------------------------------------------------------------------------------
*/
HWND CTrayNotify::GetHwnd() const
{
return m_nid.hWnd;
}
/*---------------------------------------------------------------------------------
*/
void CTrayNotify::SetID(const UINT uID)
{
m_nid.uID=uID;
}
/*---------------------------------------------------------------------------------
*/
UINT CTrayNotify::GetID() const
{
return m_nid.uID;
}
/*---------------------------------------------------------------------------------
*/
BOOL CTrayNotify::Refresh()
{
return Shell_NotifyIcon(NIM_MODIFY,&m_nid);
}
/*---------------------------------------------------------------------------------
*/
BOOL CTrayNotify::ShowIcon(BOOL bShow)
{
BOOL bRet=FALSE;
if(m_bShow)
{
if(!bShow)
{
bRet=Shell_NotifyIcon(NIM_DELETE,&m_nid);
}
}
else
{
if(bShow)
bRet=Shell_NotifyIcon(NIM_ADD,&m_nid);
}
if(bRet)
{
m_bShow=bShow;
}
return bRet;
}
/*---------------------------------------------------------------------------------
*/
BOOL CTrayNotify::Modify(const NOTIFYICONDATA& nid)
{
CopyMemory((void*)&m_nid,(void*)&nid,sizeof(nid));
return Shell_NotifyIcon(NIM_MODIFY,&m_nid);
}
/*---------------------------------------------------------------------------------
*/
void CTrayNotify::GetNid(NOTIFYICONDATA* pNid) const
{
CopyMemory((void*)pNid,(void*)&m_nid,sizeof(m_nid));
}
/*---------------------------------------------------------------------------------
*/
BOOL CTrayNotify::IsIconShow() const
{
return m_bShow;
}
/*---------------------------------------------------------------------------------
*/
void CTrayNotify::Reset()
{
ShowIcon(FALSE);
memset((void*)&m_nid,0,sizeof(m_nid));
}
/*---------------------------------------------------------------------------------
*/
void CTrayNotify::SetFlag(UINT uFlag)
{
m_nid.uFlags=uFlag;
}
/*---------------------------------------------------------------------------------
*/
UINT CTrayNotify::GetFlag() const
{
return m_nid.uFlags;
}
//文件尾