1、添加菜单资源和图标资源。比如ID是IDR_MENU_GL(菜单);可以添加IDR_图标,我们这里使用IDR_MAINFRAME系统图标,因此就不用添加了。2、在MainFrm.h中添加定义:
//对托盘图标产生的鼠标消息
#define WM_ICON_NOTIFY  WM_USER+103、在MainFrm.h,class CMainFrame中定义一个消息函数和图标结构:
public:
LRESULT OnTaskbar(WPARAM wParam,LPARAM lParam);
NOTIFYICONDATA m_tnid;4、建立消息映射(MainFrm.cpp):

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
.........................
ON_MESSAGE(WM_ICON_NOTIFY,OnTaskbar)
.........................
END_MESSAGE_MAP()
//就是把消息WM_ICON_NOTIFY和函数OnTaskbar绑定。5、在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 函数后面添加如下代码(MainFrm.cpp): //图标句柄
HICON hIcon; char lpszTip[] = "当鼠标指针停留在托盘图标上时,要显示的提示。";
//获得资源实例
HINSTANCE hInst = AfxFindResourceHandle(MAKEINTRESOURCE(IDR_MAINFRAME),RT_GROUP_ICON);
//获得图标句柄
hIcon = (HICON)LoadImage(hInst,MAKEINTRESOURCE(IDR_MAINFRAME),IMAGE_ICON,16,16,LR_DEFAULTCOLOR); //给NOTIFYICONDATA结构赋值
//结构长度
m_tnid.cbSize = sizeof(NOTIFYICONDATA);
//窗口句柄
m_tnid.hWnd = m_hWnd;
//菜单ID
m_tnid.uID = IDR_MENU_GL;
//属性标志:NIF_MESSAGE发送NOTIFYICONDATA结构指明的消息uCallbackMessage。
//属性标志:NIF_ICON在右下角显示图标。
m_tnid.uFlags = NIF_MESSAGE | NIF_ICON ; //发送的消息,前面已经和函数OnTaskbar绑定。
m_tnid.uCallbackMessage = WM_ICON_NOTIFY; //在右下角显示的图标。
m_tnid.hIcon = hIcon; //设置鼠标停留时显示的文字提示。
if (lpszTip)
{
lstrcpyn(m_tnid.szTip,lpszTip,sizeof(m_tnid.szTip));
}
else
{
m_tnid.szTip[0] = '\0';
} //实质操作:调用Shell_NotifyIcon函数通过NIM_ADD向任务栏写图标
//增加NIM_ADD、修改NIM_MODIFY、删除NIM_DELETE
Shell_NotifyIcon(NIM_ADD,&m_tnid); //释放图标资源
if (hIcon)
{
DestroyIcon(hIcon);
}6、建立消息响应函数(MainFrm.cpp)。 LRESULT CMainFrame::OnTaskbar(WPARAM wParam,LPARAM lParam)
{
//获得鼠标消息
UINT uMouseMsg = (UINT)lParam; switch(uMouseMsg)
{
//处理左键按下
case WM_LBUTTONDOWN:
//弹出Windows窗体。SW_RESTORE保持关闭时的样子。
AfxGetMainWnd()->ShowWindow(SW_RESTORE);
break; //处理右键按下,弹出快捷菜单。
case WM_RBUTTONDOWN:
{
//定义菜单对象和一个指针。
CMenu menu, *pSubMenu; //用于获得鼠标位置。
CPoint pos;

//获取菜单项,失败返回。
if (!menu.LoadMenu(m_tnid.uID)) return 0; //获取菜单第0项,并得到指针。失败返回。
if (!(pSubMenu = menu.GetSubMenu(0))) return 0; //设置0项为缺省菜单,黑亮显示。
::SetMenuDefaultItem(pSubMenu->m_hMenu, 0, TRUE);

//获得鼠标当前位置。
GetCursorPos(&pos);   //在当前位置上弹出菜单
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd()); //销毁菜单。
menu.DestroyMenu();
}
break;
default:
break;
}
return 0;
}6、当关闭和最小化Windows窗口时,隐藏Windows窗体和删除图标。在WindowProc中加入: LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
//当点击最小化按钮时
if((message==WM_SYSCOMMAND)&&(wParam==SC_MINIMIZE)) 
{
AfxGetMainWnd()->ShowWindow(SW_FORCEMINIMIZE);
}
if (message==WM_CLOSE)
{
//用NIM_DELETE删除图标
Shell_NotifyIcon(NIM_DELETE,&m_tnid);
} return CFrameWnd::WindowProc(message, wParam, lParam);
}
//如果是基于对话框的程序,可以添加相应的消息处理函数,可以自动添加,不用手动添加。7、为快捷菜单添加事件处理程序。用向导添加即可。