一个很弱的托盘类
在学习实现托盘图标的过程中,自己尝试着写了个托盘类。
当然了,不用问也知道,这个类是很弱的。
头文件:
////////////////////////////////////////////////////////////////////////
//
//
// 文件说明 : TrayIcon类声明
//
// 简要说明 : 为方便自己使用,同时以达到练手为目的,于是简单的封装(姑且用"封装")了一个托盘类.
// 使用该类时,可以通过使用重载函数Create来进行内部的设置,随后调用LoadTrayIcon或
// UnLoadTrayIcon函数来进行在系统托盘中的图标显示和隐藏.
//
// zhaoyg : 2010.1.23
//
//////////////////////////////////////////////////////////////////////// //
#pragma once
class TrayIcon
{
public :
TrayIcon( void );
~ TrayIcon( void );
typedef void ( * CALLBACKTrayIconNotify)(LPVOID thisclass ,WPARAM wparam ,LPARAM lparam);
void Create(LPVOID callerthis , const HWND & hwnd , UINT iconID , UINT CallBackMessage,
CALLBACKTrayIconNotify pcallback, LPCTSTR ptips , HICON hicon ,
UINT flags = NIF_MESSAGE | NIF_ICON | NIF_TIP);
void Create(LPVOID callerthis , const HWND & hwnd , UINT iconID);
void OnTrayNotification(WPARAM wparam ,LPARAM lparam);
bool LoadTrayIcon();
bool UnLoadTrayIcon();
void SetIcon( const HICON & hicon);
void SetTip( const LPCTSTR tipstr);
void SetBalloonTip(UINT timeout , DWORD infoflags , const LPCTSTR infotitle , const LPCTSTR info);
void SetCallBackMessage(UINT CallBackMessage , CALLBACKTrayIconNotify pcallback);
// change the existing icon status
bool ChangeIcon( const HICON & hicon);
bool ChangeTip( const LPCTSTR tipstr);
bool ChangeBalloonTip(UINT timeout , DWORD infoflags , const LPCTSTR infotitle , const LPCTSTR info);
bool visible();
bool enable();
protected :
NOTIFYICONDATA m_iconinfo;
CALLBACKTrayIconNotify m_pcallback;
LPVOID m_thisclass;
bool m_enable;
bool m_ishide;
};
//
// 文件说明 : TrayIcon类声明
//
// 简要说明 : 为方便自己使用,同时以达到练手为目的,于是简单的封装(姑且用"封装")了一个托盘类.
// 使用该类时,可以通过使用重载函数Create来进行内部的设置,随后调用LoadTrayIcon或
// UnLoadTrayIcon函数来进行在系统托盘中的图标显示和隐藏.
//
// zhaoyg : 2010.1.23
//
//////////////////////////////////////////////////////////////////////// //
#pragma once
class TrayIcon
{
public :
TrayIcon( void );
~ TrayIcon( void );
typedef void ( * CALLBACKTrayIconNotify)(LPVOID thisclass ,WPARAM wparam ,LPARAM lparam);
void Create(LPVOID callerthis , const HWND & hwnd , UINT iconID , UINT CallBackMessage,
CALLBACKTrayIconNotify pcallback, LPCTSTR ptips , HICON hicon ,
UINT flags = NIF_MESSAGE | NIF_ICON | NIF_TIP);
void Create(LPVOID callerthis , const HWND & hwnd , UINT iconID);
void OnTrayNotification(WPARAM wparam ,LPARAM lparam);
bool LoadTrayIcon();
bool UnLoadTrayIcon();
void SetIcon( const HICON & hicon);
void SetTip( const LPCTSTR tipstr);
void SetBalloonTip(UINT timeout , DWORD infoflags , const LPCTSTR infotitle , const LPCTSTR info);
void SetCallBackMessage(UINT CallBackMessage , CALLBACKTrayIconNotify pcallback);
// change the existing icon status
bool ChangeIcon( const HICON & hicon);
bool ChangeTip( const LPCTSTR tipstr);
bool ChangeBalloonTip(UINT timeout , DWORD infoflags , const LPCTSTR infotitle , const LPCTSTR info);
bool visible();
bool enable();
protected :
NOTIFYICONDATA m_iconinfo;
CALLBACKTrayIconNotify m_pcallback;
LPVOID m_thisclass;
bool m_enable;
bool m_ishide;
};
实现:
////////////////////////////////////////////////////////////////////////
//
//
// 文件说明 : TrayIcon类实现
//
// 简要说明 : 托盘类
//
// zhaoyg : 2010.1.23
//
//////////////////////////////////////////////////////////////////////// //
#include " StdAfx.h "
#include " TrayIcon.h "
TrayIcon::TrayIcon( void )
{
memset( & m_iconinfo, 0 , sizeof (NOTIFYICONDATA)) ;
m_thisclass = NULL;
m_pcallback = NULL;
m_enable = false ;
m_ishide = false ;
}
TrayIcon:: ~ TrayIcon( void )
{
}
//////////////////////////////////////////////////////////////////////// //
// 函数 Create(LPVOID callerthis , const HWND &hwnd , UINT iconID , UINT CallBackMessage, CALLBACKTrayIconNotify pcallback, LPCTSTR ptips , HICON hicon , UINT flags);
//
// 功能 : NOTIFYICONDATA
//
// 参数说明:
// callerthis : 包含TrayIcon对象的类对象的this指针,该指针将传入参数pcallback指向的回调函数中
// hwnd : 包含TrayIcon对象的类的句柄
// iconID : 托盘对象ID
// CallBackMessage : 回调消息.系统将向hwnd所表示的窗口发送该消息.该消息与一个自定义的消息处理函数关联
// pcallback : 回调函数指针.指向的函数即为CallBackMessage消息的响应函数
// ptips : 提示字符串.当鼠标放置于托盘上的图标时显示该字符串
// hicon : 需要显示的图标句柄
// flags : 设置托盘的相关属性.详见MSDN中的NOTIFYICONDATA结构体
//////////////////////////////////////////////////////////////////////// //
void TrayIcon::Create( LPVOID callerthis , const HWND & hwnd , UINT iconID , UINT CallBackMessage,
CALLBACKTrayIconNotify pcallback, LPCTSTR ptips , HICON hicon ,
UINT flags)
{
m_iconinfo.cbSize = sizeof (NOTIFYICONDATA);
m_iconinfo.hWnd = hwnd;
m_iconinfo.uID = iconID;
m_iconinfo.hIcon = hicon;
m_iconinfo.uFlags = flags;
wcscpy_s (m_iconinfo.szTip,ptips);
m_iconinfo.uCallbackMessage = CallBackMessage;
m_pcallback = pcallback;
m_thisclass = callerthis;
m_enable = true ;
}
void TrayIcon::Create( LPVOID callerthis , const HWND & hwnd ,UINT iconID)
{
m_iconinfo.cbSize = sizeof (NOTIFYICONDATA);
m_iconinfo.hWnd = hwnd;
m_thisclass = callerthis;
m_iconinfo.uID = iconID;
m_enable = true ;
}
void TrayIcon::OnTrayNotification( WPARAM wparam ,LPARAM lparam )
{
ASSERT(m_pcallback != NULL && m_thisclass != NULL);
return m_pcallback(m_thisclass,wparam , lparam);
}
bool TrayIcon::LoadTrayIcon()
{
if (m_enable && ! m_ishide)
{
m_ishide = Shell_NotifyIcon(NIM_ADD , & m_iconinfo);
return m_ishide;
}
return false ;
}
bool TrayIcon::UnLoadTrayIcon()
{
if (m_enable && m_ishide)
{
bool tmp = Shell_NotifyIcon(NIM_DELETE , & m_iconinfo);
m_ishide = ! tmp;
m_iconinfo;
return tmp;
}
return false ;
}
void TrayIcon::SetIcon( const HICON & hicon )
{
if (m_enable)
{
m_iconinfo.uFlags |= NIF_ICON;
m_iconinfo.hIcon = hicon;
}
}
void TrayIcon::SetTip( const LPCTSTR tipstr )
{
ASSERT(wcslen(tipstr) < 64 );
m_iconinfo.uFlags |= NIF_TIP;
wcscpy_s (m_iconinfo.szTip , tipstr);
}
void TrayIcon::SetBalloonTip( UINT timeout , DWORD infoflags , const LPCTSTR infotitle , const LPCTSTR info )
{
m_iconinfo.uFlags |= NIF_INFO;
m_iconinfo.uTimeout = timeout;
m_iconinfo.dwInfoFlags = infoflags;
wcscpy_s (m_iconinfo.szInfo,info);
wcscpy_s (m_iconinfo.szInfoTitle,infotitle);
}
void TrayIcon::SetCallBackMessage( UINT CallBackMessage , CALLBACKTrayIconNotify pcallback )
{
m_iconinfo.uFlags |= NIF_MESSAGE;
m_iconinfo.uCallbackMessage = CallBackMessage;
m_pcallback = pcallback;
}
bool TrayIcon::ChangeIcon( const HICON & hicon )
{
m_iconinfo.uFlags |= NIF_ICON;
m_iconinfo.hIcon = hicon;
return Shell_NotifyIcon(NIM_MODIFY , & m_iconinfo);
}
bool TrayIcon::ChangeTip( const LPCTSTR tipstr )
{
ASSERT(wcslen(tipstr) < 64 );
m_iconinfo.uFlags |= NIF_TIP;
wcscpy_s(m_iconinfo.szTip , tipstr);
return Shell_NotifyIcon(NIM_MODIFY , & m_iconinfo);
}
bool TrayIcon::ChangeBalloonTip( UINT timeout , DWORD infoflags , const LPCTSTR infotitle , const LPCTSTR info )
{
ASSERT(wcslen(infotitle) < 63 && wcslen(info) < 255 );
m_iconinfo.uFlags |= NIF_INFO;
m_iconinfo.uTimeout = timeout;
m_iconinfo.dwInfoFlags = infoflags;
wcscpy_s(m_iconinfo.szInfoTitle , infotitle);
wcscpy_s(m_iconinfo.szInfo , info);
int i = Shell_NotifyIcon(NIM_MODIFY , & m_iconinfo);
return i;
}
bool TrayIcon::visible()
{
return ! m_ishide;
}
bool TrayIcon::enable()
{
return m_enable;
}
//
// 文件说明 : TrayIcon类实现
//
// 简要说明 : 托盘类
//
// zhaoyg : 2010.1.23
//
//////////////////////////////////////////////////////////////////////// //
#include " StdAfx.h "
#include " TrayIcon.h "
TrayIcon::TrayIcon( void )
{
memset( & m_iconinfo, 0 , sizeof (NOTIFYICONDATA)) ;
m_thisclass = NULL;
m_pcallback = NULL;
m_enable = false ;
m_ishide = false ;
}
TrayIcon:: ~ TrayIcon( void )
{
}
//////////////////////////////////////////////////////////////////////// //
// 函数 Create(LPVOID callerthis , const HWND &hwnd , UINT iconID , UINT CallBackMessage, CALLBACKTrayIconNotify pcallback, LPCTSTR ptips , HICON hicon , UINT flags);
//
// 功能 : NOTIFYICONDATA
//
// 参数说明:
// callerthis : 包含TrayIcon对象的类对象的this指针,该指针将传入参数pcallback指向的回调函数中
// hwnd : 包含TrayIcon对象的类的句柄
// iconID : 托盘对象ID
// CallBackMessage : 回调消息.系统将向hwnd所表示的窗口发送该消息.该消息与一个自定义的消息处理函数关联
// pcallback : 回调函数指针.指向的函数即为CallBackMessage消息的响应函数
// ptips : 提示字符串.当鼠标放置于托盘上的图标时显示该字符串
// hicon : 需要显示的图标句柄
// flags : 设置托盘的相关属性.详见MSDN中的NOTIFYICONDATA结构体
//////////////////////////////////////////////////////////////////////// //
void TrayIcon::Create( LPVOID callerthis , const HWND & hwnd , UINT iconID , UINT CallBackMessage,
CALLBACKTrayIconNotify pcallback, LPCTSTR ptips , HICON hicon ,
UINT flags)
{
m_iconinfo.cbSize = sizeof (NOTIFYICONDATA);
m_iconinfo.hWnd = hwnd;
m_iconinfo.uID = iconID;
m_iconinfo.hIcon = hicon;
m_iconinfo.uFlags = flags;
wcscpy_s (m_iconinfo.szTip,ptips);
m_iconinfo.uCallbackMessage = CallBackMessage;
m_pcallback = pcallback;
m_thisclass = callerthis;
m_enable = true ;
}
void TrayIcon::Create( LPVOID callerthis , const HWND & hwnd ,UINT iconID)
{
m_iconinfo.cbSize = sizeof (NOTIFYICONDATA);
m_iconinfo.hWnd = hwnd;
m_thisclass = callerthis;
m_iconinfo.uID = iconID;
m_enable = true ;
}
void TrayIcon::OnTrayNotification( WPARAM wparam ,LPARAM lparam )
{
ASSERT(m_pcallback != NULL && m_thisclass != NULL);
return m_pcallback(m_thisclass,wparam , lparam);
}
bool TrayIcon::LoadTrayIcon()
{
if (m_enable && ! m_ishide)
{
m_ishide = Shell_NotifyIcon(NIM_ADD , & m_iconinfo);
return m_ishide;
}
return false ;
}
bool TrayIcon::UnLoadTrayIcon()
{
if (m_enable && m_ishide)
{
bool tmp = Shell_NotifyIcon(NIM_DELETE , & m_iconinfo);
m_ishide = ! tmp;
m_iconinfo;
return tmp;
}
return false ;
}
void TrayIcon::SetIcon( const HICON & hicon )
{
if (m_enable)
{
m_iconinfo.uFlags |= NIF_ICON;
m_iconinfo.hIcon = hicon;
}
}
void TrayIcon::SetTip( const LPCTSTR tipstr )
{
ASSERT(wcslen(tipstr) < 64 );
m_iconinfo.uFlags |= NIF_TIP;
wcscpy_s (m_iconinfo.szTip , tipstr);
}
void TrayIcon::SetBalloonTip( UINT timeout , DWORD infoflags , const LPCTSTR infotitle , const LPCTSTR info )
{
m_iconinfo.uFlags |= NIF_INFO;
m_iconinfo.uTimeout = timeout;
m_iconinfo.dwInfoFlags = infoflags;
wcscpy_s (m_iconinfo.szInfo,info);
wcscpy_s (m_iconinfo.szInfoTitle,infotitle);
}
void TrayIcon::SetCallBackMessage( UINT CallBackMessage , CALLBACKTrayIconNotify pcallback )
{
m_iconinfo.uFlags |= NIF_MESSAGE;
m_iconinfo.uCallbackMessage = CallBackMessage;
m_pcallback = pcallback;
}
bool TrayIcon::ChangeIcon( const HICON & hicon )
{
m_iconinfo.uFlags |= NIF_ICON;
m_iconinfo.hIcon = hicon;
return Shell_NotifyIcon(NIM_MODIFY , & m_iconinfo);
}
bool TrayIcon::ChangeTip( const LPCTSTR tipstr )
{
ASSERT(wcslen(tipstr) < 64 );
m_iconinfo.uFlags |= NIF_TIP;
wcscpy_s(m_iconinfo.szTip , tipstr);
return Shell_NotifyIcon(NIM_MODIFY , & m_iconinfo);
}
bool TrayIcon::ChangeBalloonTip( UINT timeout , DWORD infoflags , const LPCTSTR infotitle , const LPCTSTR info )
{
ASSERT(wcslen(infotitle) < 63 && wcslen(info) < 255 );
m_iconinfo.uFlags |= NIF_INFO;
m_iconinfo.uTimeout = timeout;
m_iconinfo.dwInfoFlags = infoflags;
wcscpy_s(m_iconinfo.szInfoTitle , infotitle);
wcscpy_s(m_iconinfo.szInfo , info);
int i = Shell_NotifyIcon(NIM_MODIFY , & m_iconinfo);
return i;
}
bool TrayIcon::visible()
{
return ! m_ishide;
}
bool TrayIcon::enable()
{
return m_enable;
}