热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据项_VC++托盘图标实现类封装及使用(附源码)

篇首语:本文由编程笔记#小编为大家整理,主要介绍了VC++托盘图标实现类封装及使用(附源码)相关的知识,希望对你有一定的参考价值。        在系统桌面右下角的托盘区域,创建一个托盘

篇首语:本文由编程笔记#小编为大家整理,主要介绍了VC++托盘图标实现类封装及使用(附源码)相关的知识,希望对你有一定的参考价值。


       在系统桌面右下角的托盘区域,创建一个托盘图标,已经是很多软件的标配了,特别是IM即时通讯软件,要在托盘图标上显示来消息时的闪动头像。

       其实托盘图标创建很简单,使用起来也比较方便,主要是调用Shell_NotifyIcon API函数,传入不同参数表示对应的操作:



1)NIM_ADD:创建一个托盘图标;


2)NIM_MODIFY:修改托盘图标,主要是用来修改图标和提示文字的;


3)NIM_DELETE:删除托盘图标。


下面给出一个完整的托盘图标封装类。


1、托盘图标封装类CTrayIcon

       主要有CTrayIcon::CreateCTrayIcon::SetIconCTrayIcon::SetTooltipTextCTrayIcon::OnIconNotification等几个接口。其中,CTrayIcon::Create接口用来创建托盘图标;CTrayIcon::SetIcon用来设置图标或者修改图标;CTrayIcon::SetTooltipText用来设置托盘图标的提示文字;CTrayIcon::OnIconNotification用来处理托盘图标的鼠标消息。

         CTrayIcon类的头文件如下:

#ifndef TRAYICON_H
#define TRAYICON_H
class CTrayIcon
private:
CTrayIcon();
CTrayIcon( CWnd* pWnd, WORD uCallbackMessage, LPCTSTR szTip, HICON icon, WORD uID );
public:
~CTrayIcon();
static CTrayIcon& Instance();
public:
// 创建系统图标
BOOL Create( CWnd* pWnd, WORD uCallbackMessage, LPCTSTR szTip, HICON icon, WORD uID );
// 获取NOTIFYICONDATA信息
NOTIFYICONDATA GetNotifyIconData() return m_tnd;
// 关于提示文本
BOOL32 SetTooltipText( LPCTSTR pszTooltipText );
BOOL32 SetTooltipText( WORD nID );
CString GetTooltipText() const;
// 关于图标
BOOL32 SetIcon( HICON hIcon );
BOOL32 SetIcon( LPCTSTR lpIconName );
BOOL32 SetIcon( WORD nIDResource );
HICON GetIcon() const;
void HideIcon();
void ShowIcon();
void DeleteIcon();
// 关于通知窗口
BOOL32 SetNotificationWnd( CWnd* pNotifyWnd );
CWnd* GetNotificationWnd() const;
CPoint GetTrayCursorPos();
// 自定义消息处理函数
virtual LRESULT OnIconNotification( WPARAM wParam, LPARAM lParam );
protected:
NOTIFYICONDATA m_tnd; // 数据结构,请参考在线帮助
CPoint m_trayCursorPos; // 托盘响应WM_MOUSEMOVE时的鼠标坐标
BOOL32 m_bProcessingBtnMsg; // 是否在处理右键单击或左键双击托盘消息,此时应将消息盒子提示窗口掩藏掉
;
#endif

       CTrayIcon类的cpp源文件如下:

#include "stdafx.h"
#include "trayicon.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CTrayIcon::CTrayIcon()
: m_trayCursorPos( CPoint(0, 0) )
, m_bProcessingBtnMsg( FALSE )

memset( &m_tnd, 0, sizeof(m_tnd) );

CTrayIcon::CTrayIcon( CWnd* pWnd, WORD uCallbackMessage, LPCTSTR szToolTip, HICON icon, WORD uID )

Create( pWnd, uCallbackMessage, szToolTip, icon, uID );

CTrayIcon& CTrayIcon::Instance()
static CTrayIcon s_hInstance;
return s_hInstance;
CTrayIcon::~CTrayIcon()
HideIcon();
DeleteIcon();
BOOL32 CTrayIcon::Create( CWnd* pWnd, WORD uCallbackMessage, LPCTSTR szToolTip, HICON icon, WORD uID )

BOOL32 bEnabled = FALSE;
// 文件只能使用在WINDOW 95以上的版本中
VERIFY( bEnabled = ( GetVersion() & 0xff ) >= 4 );
if ( !bEnabled )

uilog( _T("[CTrayIcon::Create] os version below WINDOW 95") );
return FALSE;

// 确认通知窗口有效
VERIFY( bEnabled = (pWnd && ::IsWindow(pWnd->GetSafeHwnd())) );
if ( !bEnabled )

uilog( _T("[CTrayIcon::Create] handle of main window is invalid") );
return FALSE;

// 确认自定义消息大于WM_USER
ASSERT( uCallbackMessage >= WM_USER );
// 确定提示文本长度小于64
ASSERT( _tcslen( szToolTip ) <&#61; 64 );
// 定义NOTIFYICONDATA结构的数据项
m_tnd.cbSize &#61; sizeof(NOTIFYICONDATA);
m_tnd.hWnd &#61; pWnd->GetSafeHwnd();
m_tnd.uID &#61; uID;
m_tnd.hIcon &#61; icon;
m_tnd.uFlags &#61; NIF_MESSAGE | NIF_ICON | NIF_TIP;
m_tnd.uCallbackMessage &#61; uCallbackMessage;
strcpy ( m_tnd.szTip, szToolTip );
// 设置图标
bEnabled &#61; Shell_NotifyIcon( NIM_ADD, &m_tnd );
if ( !bEnabled )

uilog( _T("[CTrayIcon::Create] Shell_NotifyIcon[NIM_ADD] failed") );

return bEnabled;

void CTrayIcon::DeleteIcon()

m_tnd.uFlags &#61; 0;
Shell_NotifyIcon( NIM_DELETE, &m_tnd );

void CTrayIcon::HideIcon()

m_tnd.uFlags &#61; NIF_ICON;
Shell_NotifyIcon( NIM_DELETE, &m_tnd );

void CTrayIcon::ShowIcon()

m_tnd.uFlags &#61; NIF_MESSAGE | NIF_ICON | NIF_TIP;
Shell_NotifyIcon( NIM_ADD, &m_tnd );

BOOL32 CTrayIcon::SetIcon( HICON hIcon )

if ( hIcon &#61;&#61; NULL )

WriteTrayIconLog( _T("[CTrayIcon::SetIcon(HICON hIcon)]hIcon &#61;&#61; NULL"));

else

WriteTrayIconLog( _T("[CTrayIcon::SetIcon(HICON hIcon)]hIcon &#61; %d"), hIcon );

m_tnd.uFlags &#61; NIF_ICON;
m_tnd.hIcon &#61; hIcon;
BOOL32 bRet &#61; Shell_NotifyIcon( NIM_MODIFY, &m_tnd );
if ( !bRet )

WriteTrayIconLog( _T("[CTrayIcon::SetIcon(HICON hIcon)]Shell_NotifyIcon(NIM_MODIFY-NIF_ICON) failed, lasterrid: %d"), GetLastError() );

return bRet;

BOOL32 CTrayIcon::SetIcon( LPCTSTR lpszIconName )

WriteTrayIconLog( _T("[CTrayIcon::SetIcon(LPCTSTR lpszIconName)]lpszIconName &#61; %s"), lpszIconName );
HICON hIcon &#61; AfxGetApp()->LoadIcon( lpszIconName );
return SetIcon( hIcon );

BOOL32 CTrayIcon::SetIcon( WORD nIDResource )

WriteTrayIconLog( _T("[CTrayIcon::SetIcon(WORD nIDResource)]nIDResource &#61; %d"), nIDResource );
HICON hIcon &#61; AfxGetApp()->LoadIcon( nIDResource );
return SetIcon( hIcon );

HICON CTrayIcon::GetIcon() const

HICON hIcon &#61; NULL;
hIcon &#61; m_tnd.hIcon;
return hIcon;

BOOL32 CTrayIcon::SetTooltipText( LPCTSTR pszTip )

m_tnd.uFlags &#61; NIF_TIP;
_tcscpy( m_tnd.szTip, pszTip );
return Shell_NotifyIcon( NIM_MODIFY, &m_tnd );

BOOL32 CTrayIcon::SetTooltipText( WORD nID )

CString strText;
VERIFY( strText.LoadString( nID ) );
return SetTooltipText( strText );

CString CTrayIcon::GetTooltipText() const

CString strText;
strText &#61; m_tnd.szTip;
return strText;

BOOL32 CTrayIcon::SetNotificationWnd( CWnd* pWnd )

ASSERT( pWnd && ::IsWindow( pWnd->GetSafeHwnd() ) );
m_tnd.hWnd &#61; pWnd->GetSafeHwnd();
m_tnd.uFlags &#61; 0;
return Shell_NotifyIcon( NIM_MODIFY, &m_tnd );

CWnd* CTrayIcon::GetNotificationWnd() const

return CWnd::FromHandle( m_tnd.hWnd );

LRESULT CTrayIcon::OnIconNotification( WPARAM wParam, LPARAM lParam )

if ( WM_MOUSEMOVE &#61;&#61; lParam )

// 鼠标移动消息
return 0;

if ( wParam !&#61; m_tnd.uID )

return 0L;

// 单击右键弹出菜单
if ( WM_RBUTTONUP &#61;&#61; LOWORD(lParam) )

// 右键弹起消息处理

else if ( WM_LBUTTONDOWN &#61;&#61; LOWORD(lParam) || WM_LBUTTONDBLCLK &#61;&#61; LOWORD(lParam) )

// 单击或者双击消息处理

m_bProcessingBtnMsg &#61; FALSE;

return 1;

CPoint CTrayIcon::GetTrayCursorPos()
return m_trayCursorPos;

2、调用CTrayIcon::Create创建图标

        调用CTrayIcon::Create接口创建图标&#xff0c;创建时第一个参数是接收托盘通知消息的窗口&#xff0c;第二个参数是托盘被操作时回调的窗口自定义消息id&#xff0c;后面几个参数是用来设置托盘图标的提示文字和图标icon的&#xff0c;相关代码如下&#xff1a;

// 利用图标资源的ID去创建托盘图标
BOOL32 CreateTrayIcon( WORD nIDResource )
BOOL32 bSuccess &#61; FALSE;
HICON hIcon &#61; LoadIcon( AfxGetResourceHandle(), MAKEINTRESOURCE( nIDResource ) );
bSuccess &#61; CTrayIcon::Instance().Create( this, WM_MY_TRAY_NOTIFICATION, _T("托盘图标提示文字"), hIcon, IDI_ICON_SYSTEM );
CTrayIcon::Instance().SetIcon( hIcon );
CTrayIcon::Instance().ShowIcon();
return bSuccess;

3、将回调给指定窗口的托盘图标操作自定义消息投递到CTrayIcon::OnIconNotification接口中去处理

      从创建托盘图标的代码可以看出&#xff0c;回调给指定窗口的托盘图标操作消息是自定义消息&#xff0c;是用户在创建托盘图标时指定的。先添加自定义消息的映射&#xff0c;接收到自定义消息&#xff0c;然后投递到CTrayIcon::OnIconNotification接口中去处理。相关代码如下&#xff1a;

LRESULT OnTrayNotification( WPARAM wParam, LPARAM lParam )

ON_MESSAGE( WM_MY_TRAY_NOTIFICATION, OnTrayNotification )

LRESULT CMainFrameWnd::OnTrayNotification( WPARAM wParam, LPARAM lParam )
return CTrayIcon::Instance().OnIconNotification( wParam, lParam );

推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
author-avatar
33今夜无眠44
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有