您的位置:首页 > 编程语言 > C语言/C++

在windows系统任务栏的托盘中显示图标 c++

2007-12-05 14:20 573 查看
//在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;

......

}

水平有限,如有错误请指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: