1)准备一个菜单资源,并导入一个图标资源(用作任务栏上显示的图标)
2)在你的程序中添加两个变量,一个是CMenu对象m_Menu,一个是NOTIFYICONDATA结构体对象m_NotifyData,这个结构体作用是"包含系统需要的用来传递托盘区域消息的信息",具体请查询MSDN
3)自定义一个消息,在窗口最小化时向任务栏注册该消息,以便在左单击任务栏上的图标时能够恢复显示对话框或右键显示菜单.
#define WM_TRAYMESSAGE WM_USER + 1
4)在对话框初始化时加载菜单资源,并初始化m_NotifyData结构体对象.
具体代码如下:
m_TrayMenu.LoadMenu(IDR_MENU); //加载菜单资源
//初始化m_NotifyData
m_NotifyData.cbSize = sizeof(NOTIFYICONDATA);
m_NotifyData.hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
m_NotifyData.hWnd = m_hWnd;
char szTrayText[11] = "系统管理";
strncpy(m_NotifyData.szTip,szTrayText,strlen(szTrayText) + 1);
m_NotifyData.uCallbackMessage = WM_TRAYMESSAGE;
m_NotifyData.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
5)在对话框的OnSysCommand函数中截获窗口最小化的消息,调用Shell_NotifyIcon外壳函数向任务栏注册托盘信息
Shell_NotifyIcon函数作用是向任务栏区域发送一个增加,改变,或删除图标的消息
Shell_NotifyIcon(NIM_ADD,&m_NotifyData); //注册任务栏信息,将消息WM_TRAYMESSAGE与图标关联起来
6)添加消息WM_TRAYMESSAGE处理函数OnTrayMenu(WPARAM wParam,LPARAM lParam);(注意手动添加消息映射时,响应函数返回值是LRESULT而不是void,在VS2008上若为void会报错)
代码如下:
LRESULT CTrayMenuDlg::OnTrayMessage(WPARAM wParam, LPARAM lParam)
{
if(lParam == WM_LBUTTONDOWN)
{
ShowWindow(SW_RESTORE); //还原显示窗口
}
else if(lParam == WM_RBUTTONDOWN)
{
CPoint curPT;
::GetCursorPos(&curPT);
CMenu* pSubMenu = m_TrayMenu.GetSubMenu(0); //获取子菜单
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,curPT.x,
curPT.y,AfxGetApp()->m_pMainWnd,TPM_LEFTALIGN); //弹出菜单
}
return 1;
}
添加消息映射宏
ON_MESSAGE(WM_TRAYMESSAGE,OnTrayMessage)
7)最后添加OnCancel()函数,在对话框关闭时删除任务栏中的托盘图标
代码如下:
Shell_NotifyIcon(NIM_DELETE,&m_NotifyData); //删除托盘菜单
CDialog::OnCancel();