n hIcon;
BOOL CSystemIcon::SetTooltipText(LPCTSTR pszTip)
if (!m_bEnabled) return FALSE;
m_tnd.uFlags = NIF_TIP;
_tcscpy(m_tnd.szTip, pszTip);
return Shell_NotifyIcon(NIM_MODIFY, &m_tnd);
BOOL CSystemIcon::SetTooltipText(UINT nID)
CString strText;
VERIFY(strText.LoadString(nID));
return SetTooltipText(strText);
CString CSystemIcon::GetTooltipText() const
CString strText;
if (m_bEnabled)
strText = m_tnd.szTip;
return strText;
BOOL CSystemIcon::SetNotificationWnd(CWnd* pWnd)
if (!m_bEnabled) return FALSE;
ASSERT(pWnd && ::IsWindow(pWnd->GetSafeHwnd()));
m_tnd.hWnd = pWnd->GetSafeHwnd();
m_tnd.uFlags = 0;
return Shell_NotifyIcon(NIM_MODIFY, &m_tnd);
CWnd* CSystemIcon::GetNotificationWnd() const
return CWnd::FromHandle(m_tnd.hWnd);
LRESULT CSystemIcon::OnIconNotification(UINT wParam, LONG lParam)
if (wParam != m_tnd.uID)
return 0L;
CMenu menu, *pSubMenu;
//单击右键弹出菜单
if (LOWORD(lParam) == WM_RBUTTONUP)
if (!menu.LoadMenu(m_tnd.uID)) return 0;
if (!(pSubMenu = menu.GetSubMenu(0))) return 0;
//设定第一项为缺省
::SetMenuDefaultItem(pSubMenu->m_hMenu, 0, TRUE);
//定义弹出菜单
CPoint pos;
GetCursorPos(&pos);
::SetForegroundWindow(m_tnd.hWnd);
::TrackPopupMenu(pSubMenu->m_hMenu, 0, pos.x, pos.y, 0, m_tnd.hWnd, NULL);
::PostMessage(m_tnd.hWnd, WM_NULL, 0, 0);
menu.DestroyMenu();
else if (LOWORD(lParam) == WM_LBUTTONDBLCLK)
if (!menu.LoadMenu(m_tnd.uID)) return 0;
if (!(pSubMenu = menu.GetSubMenu(0))) return 0;
//双击左键起动缺省菜单
::SetForegroundWindow(m_tnd.hWnd);
::SendMessage(m_tnd.hWnd, WM_COMMAND, pSubMenu->GetMenuItemID(0), 0);
menu.DestroyMenu();
return 1;
三、一个简单的例子
1、使用MFC AppWizard(EXE)创建项目文件。
2、用Add to Project添加CSystemIcon类的.h文件与.CPP文件到工程中。
3、在CFrameWnd类中添加下列语句:
//自定义消息
#define WM_ICON_NOTIFY WM_USER+10
//定义成员变量
#include "SystemIcon.h"
CSystemIcon m_systemIcon
4、定义消息映象与消息处理函数
a、BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_MESSAGE(WM_ICON_NOTIFY, OnIconNotification)
END_MESSAGE_MAP()
b、LRESULT CMainFrame::OnIconNotification(WPARAM wParam, LPARAM lParam)
return m_systemIcon.OnIconNotification(wParam, lParam);
c、定义LRESULT OnIconNotification(WPARAM wParam, LPARAM lParam);
5、创建系统图标(在OnCreate中加添加):
HICON hIcon=AfxGetApp()->LoadIcon(IDI_MAINFRAME);
if (!m_systemIcon.Create(this, //消息通知窗口
WM_ICON_NOTIFY,//自定义消息
"MY SAMPLE", //提示字符串
hIcon, //图标ID号
IDR_POPUP_MENU //弹出菜单ID号
))
return -1;
6、打开资源,创建弹出菜单(IDR_POPUP_MENU),CAPTION为(_POPUP_):
菜单项包括:a、关于(ID_APP_ABOUT) b、例子(ID_APP_APP) c、退出(ID_APP_EXIT)
用ClassWizard定义(ID_APP_APP)消息处理函数,添加:AfxGetMainWnd()->ShowWindow(SW_SHOW);
7、打开资源,创建图标(IDI_ICON1)。
8、删除应用类中的函数InitInstance中的pMainFrame->ShowWindow(m_nCmdShow)语句。
9、编译执行形成执行文件。
四、本示例
程序的系统开发环境
1、硬件环境:
最好586以上微机,16M以上内存;
2、软件环境:
WINDOWS 95以上操作系统;
VC++ V4.2以上设计语言。