1.定义自定义消息ID(可在StdAfx.h或主窗体的类型声明文件中):
#define WM_USER_NOTIFYICON WM_USER + 0x100
NOTIFYICONDATA m_nid;

2.在主窗体的类型声明文件(如:MainFrame.h)加入NOTIFYICONDATA类型成员变量:

3.在主窗体中处理WM_CREATE消息:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
m_nid.cbSize = sizeof(NOTIFYICONDATA);
m_nid.hWnd = this->m_hWnd;
m_nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP; // 标志位
m_nid.uCallbackMessage = WM_USER_NOTIFYICON; // 自定义消息
m_nid.uID = IDR_MAINFRAME; // 资源ID
CString szToolTip = _T("ToolTip");
_tcscpy(m_nid.szTip, szToolTip); // 提示信息
HICON hIcon;
hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); // 图标
m_nid.hIcon = hIcon;
::Shell_NotifyIcon(NIM_ADD, &m_nid);
if (hIcon)
::DestroyIcon(hIcon);
return 0;
}
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
m_nid.cbSize = sizeof(NOTIFYICONDATA);
m_nid.hWnd = this->m_hWnd;
m_nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP; // 标志位
m_nid.uCallbackMessage = WM_USER_NOTIFYICON; // 自定义消息
m_nid.uID = IDR_MAINFRAME; // 资源ID
CString szToolTip = _T("ToolTip");
_tcscpy(m_nid.szTip, szToolTip); // 提示信息
HICON hIcon;
hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); // 图标
m_nid.hIcon = hIcon;
::Shell_NotifyIcon(NIM_ADD, &m_nid);
if (hIcon)
::DestroyIcon(hIcon);
return 0;
}
4.重载WindowProc虚函数:
LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_USER_NOTIFYICON: // 自定义消息
if (lParam == WM_LBUTTONDBLCLK) // 鼠标双击时出现主窗口
{
ShowWindow(SW_HIDE);
}
else if (lParam == WM_RBUTTONDOWN) // 鼠标右键单击时弹出菜单
{
CMenu menu;
menu.LoadMenu(IDR_TRAY); // 载入菜单
CMenu* pMenu = menu.GetSubMenu(0);
CPoint pos;
GetCursorPos(&pos);
pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, pos.x, pos.y,
AfxGetMainWnd());
}
break;
case WM_SYSCOMMAND:
if (wParam == SC_MINIMIZE) // 最小化时隐藏主窗体
{
ShowWindow(SW_HIDE);
return 0;
}
break;
}
return CWnd::WindowProc(message, wParam, lParam);
}
{
switch (message)
{
case WM_USER_NOTIFYICON: // 自定义消息
if (lParam == WM_LBUTTONDBLCLK) // 鼠标双击时出现主窗口
{
ShowWindow(SW_HIDE);
}
else if (lParam == WM_RBUTTONDOWN) // 鼠标右键单击时弹出菜单
{
CMenu menu;
menu.LoadMenu(IDR_TRAY); // 载入菜单
CMenu* pMenu = menu.GetSubMenu(0);
CPoint pos;
GetCursorPos(&pos);
pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, pos.x, pos.y,
AfxGetMainWnd());
}
break;
case WM_SYSCOMMAND:
if (wParam == SC_MINIMIZE) // 最小化时隐藏主窗体
{
ShowWindow(SW_HIDE);
return 0;
}
break;
}
return CWnd::WindowProc(message, wParam, lParam);
}
5.在主窗体中处理WM_DESTORY消息:
void CMainFrame::OnDestroy()
{
CWnd::OnDestroy();
::Shell_NotifyIcon(NIM_DELETE, &m_nid);
}
{
CWnd::OnDestroy();
::Shell_NotifyIcon(NIM_DELETE, &m_nid);
}