//在windows系统任务栏的托盘中显示图标
//使用vc6.0++
//代码改编自《TCP/IPX协议及网络编程技术》第22章,罗军舟等著,清华大学出版社
//
// 托盘指的是windows桌面窗口右下角显示图标的区域
// 管理托盘图标的函数是Shell_NotifyIcon
// 为了简化使用,定义了CyctNotifyIcon类,封装了Shell_NotifyIcon
// 该类用于构建、维护任务栏图标,主要目的是为了用户提供基于任务
// 栏图标的图形化使用界面。
//========================================================
//======yctNotifyIcon.h文件===================
//注意:代码并不完整,只包含必需的代码
class CyctNotifyIcon
{
private:
NOTIFYICONDATA m_NotifyIconData;//NOTITYICONDAT结构
void FillNotifyIconData(UINT uIDResource, const char *chTip);
public:
CyctNotifyIcon(HWND hWnd, UINT uCallbackMessage);
virtual ~CyctNotifyIcon();
void AddIcon(UINT uIDResource, const char *chTip);
void ChangeIcon(UINT uIDResource, const char *chTip);
void DeleteIcon();
};
//========================================================
//======yctNotifyIcon.cpp文件===================
#include "stdafx.h"
#include "yctNotifyIcon.h"
CyctNotifyIcon::CyctNotifyIcon(HWND hWnd, UINT uCallbackMessage)
{
//hWnd: 指定使用任务栏托盘图标的应用程序的窗口句柄
//uCallbackMessage: 指定任务栏托盘图标鼠标事件的用户回调消息;
// 可以参考msdn中的NOTIFYICONDATA结构
memset(&m_NotifyIconData, 0, sizeof(NOTIFYICONDATA));
m_NotifyIconData.hWnd = hWnd;
ASSERT(m_NotifyIconData.hWnd != NULL);
m_NotifyIconData.uCallbackMessage = uCallbackMessage;
}
CyctNotifyIcon::~CyctNotifyIcon()
{
}
void CyctNotifyIcon::FillNotifyIconData(UINT uIDResource, const char *chTip)
{
//填充NOTITYICONDAT结构
//uIDResource:指定图标资源ID
//chTip:指定在托盘图标上显示的ToolTip文本
HICON hIcon = AfxGetApp()->LoadIcon(uIDResource);
m_NotifyIconData.cbSize = sizeof(NOTIFYICONDATA);
m_NotifyIconData.hIcon = hIcon;
sprintf(m_NotifyIconData.szTip,chTip);
m_NotifyIconData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
m_NotifyIconData.uID = uIDResource;
}
void CyctNotifyIcon::AddIcon(UINT uIDResource, const char *chTip)
{
//添加(在托盘中的)图标和ToolTip文本
//uIDResource:指定图标资源ID
//chTip:指定在图标上显示的ToolTip文本
FillNotifyIconData(uIDResource, chTip);
Shell_NotifyIcon(NIM_ADD, &m_NotifyIconData);
}
void CyctNotifyIcon::ChangeIcon(UINT uIDResource, const char *chTip)
{
//改变(在托盘中的)图标和ToolTip文本
//uIDResource:指定图标资源ID
//chTip:指定在图标上显示的ToolTip文本
FillNotifyIconData(uIDResource, chTip);
Shell_NotifyIcon(NIM_MODIFY, &m_NotifyIconData);
}
void CyctNotifyIcon::DeleteIcon()
{
//删除任务栏图标
Shell_NotifyIcon(NIM_DELETE, &m_NotifyIconData);
}
//========================================================
//使用示例步骤:
//========================================================
1)在CMainFrame中定义成员变量及构造函数中初始化:
CyctNotifyIcon* m_pNotifyIcon;
CMainFrame::CMainFrame()
{
......
m_pNotifyIcon = NULL;
......
}
2)自定义YCT_NOTIFY_ICON消息及其响应函数:
#define YCT_NOTIFY_ICON WM_USER+15 //自定义消息
LRESULT CMainFrame::OnNotifyIcon( WPARAM wParam, LPARAM lParam )
{
//YCT_NOTIFY_ICON消息响应函数
//用于响应任务栏图标的鼠标事件
//wParam:任务栏图标的ID
//lParam:鼠标事件值
//附:此消息的触发来自于CMainFrame::OnCreate中CyctNotifyIcon构造函数的第二个参数的设定
switch(lParam)
{
case WM_RBUTTONUP:
//做自己想自己的事,如弹出右键菜单
......
break;
case WM_LBUTTONDBLCLK:
//做自己想自己的事,如显示主窗口
......
break;
default:
;
}
return 0;
}
3)(利用ClassWizard)重载OnCreate函数:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
......
//显示windows任务栏图标
if(m_pNotifyIcon == NULL)
{
m_pNotifyIcon = new CyctNotifyIcon(this->GetSafeHwnd(),
YCT_NOTIFY_ICON);
m_pNotifyIcon->AddIcon(IDR_MAINFRAME,(char *)YCT_TASKBAR_TOOLTIP_TEXT);
}
......
}
4)重载OnDestroy函数;目的:删除任务栏图标。
void CMainFrame::OnDestroy()
{
CFrameWnd::OnDestroy();
......
//删除windows任务栏图标
if(m_pNotifyIcon != NULL)
m_pNotifyIcon->DeleteIcon();
}
5)在析构函数中释放m_pNotifyIcon:
CMainFrame::~CMainFrame()
{
......
if(m_pNotifyIcon != NULL)
delete m_pNotifyIcon;
......
}
//水平有限,如有错误请指正。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1918285