设计任务栏托盘弹出菜单
- 首先申明变量
NOTIFYICONDATA m_traydata;
- 在OnInitDialog()函数中,增加:
m_traydata.cbSize = sizeof(NOTIFYICONDATA);
m_traydata.hIcon = AfxGetApp()->LoadIcon(IDI_TRAYICON);//IDI_TRAYICON为导入的托盘图标ICON
m_traydata.hWnd = m_hWnd;
char *m_str = "托盘提示标语";
strncpy(m_traydata.szTip,m_str,strlen(m_str)+1);//strlen +1表示将空字符拷贝到目标字符串中
m_traydata.uCallbackMessage = WM_TRARMESSAGE;
m_traydata.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
- 缩小时,显示托盘图标,添加函数:
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
在函数void CTrayPopMenuDlg::OnSysCommand(UINT nID, LPARAM lParam)的其中加入判断条件:
else if ((nID & 0xFFF0) == SC_MINIMIZE ) //缩小操作
{
ShowWindow(SW_HIDE);
Shell_NotifyIcon(NIM_ADD,&m_traydata);
}
- 退出时,同时退掉托盘图标;在退出函数OnCancel()中加入:
Shell_NotifyIcon(NIM_DELETE,&m_traydata);
- 增加托盘消息函数:
afx_msg void OnTrayMessage(WPARAM wParam, LPARAM lParam);
ON_MESSAGE(WM_TRARMESSAGE,OnTrayMessage)//预先自定义WM_TRARMESSAGE;如: #define WM_TRARMESSAGE 201
void CTestDlg::OnTrayMessage(WPARAM wParam, LPARAM lParam)
{
if (lParam == WM_LBUTTONDOWN)
{
ShowWindow(SW_RESTORE);
}
else if (lParam == WM_RBUTTONDOWN)
{
CPoint m_point;
::GetCursorPos(&m_point); //显示弹出菜单
CIconMenu* m_submenu = (CIconMenu*)m_menu.GetSubMenu(0);/*CIconMenu为重绘菜单项,可参照上一个程序
m_submenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, m_point.x,m_point.y,AfxGetApp()->m_pMainWnd,TPM_LEFTALIGN);
}
}
链接: MFC中如何创建图标菜单.
-
附本例源程序–>>链接: 源程序.
-
程序实例图