•在我们使用360,QQ等软件时,系统的任务栏中会显示一个托盘图标,用户鼠标右键时,就会弹出一个快捷菜单,进行常用功能的操作。当前实例就实现了这一功能,效果如图
7.上位机VC MFC任务栏托盘弹出菜单的实现
设计任务栏的托盘菜单,关键一点是使用函数Shell_NotifyIcon()
Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA pnid)
dwMessage可为NIM_ADD添加图标到任务栏. 从任务栏删除一个图标. NIM_MODIFY 修改任务栏的一个图标;
uCallbackMessage 应用程序自定义消息标识符. 系统会发送该消息到hWnd 的窗口中;
•2.添加一结构体变量NOTIFYICONDATA m_traydata;并初始化
• m_traydata.cbSize = sizeof(NOTIFYICONDATA);
• m_traydata.hIcon =AfxGetApp()->LoadIcon(IDI_TRAYICON);
• 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;
•在对话框的ONsysCommand中判断用户是否单击了最小化按钮,是则实现托盘菜单的加载
•voidCTrayPopMenuDlg::OnSysCommand(UINT nID, LPARAM lParam)
•{if((nID & 0xFFF0) == IDM_ABOUTBOX)
• {CAboutDlg dlgAbout; dlgAbout.DoModal();
• } else if ((nID & 0xFFF0) == SC_MINIMIZE )
• {ShowWindow(SW_HIDE);Shell_NotifyIcon(NIM_ADD,&m_traydata);}
• {CDialog::OnSysCommand(nID, lParam);
•voidCTrayPopMenuDlg::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);
•m_submenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,m_point.x,m_point.y,AfxGetApp()->m_pMainWnd,TPM_LEFTALIGN);
•最后在程序能出时,对托盘菜单进行清除
•voidCGkbc8Dlg::OnExit()
•{:Add your command handler code here
• if(MessageBox("确定要退出吗?","系统提示",MB_OKCANCEL|MB_ICONQUESTION)!=IDOK)
• Shell_NotifyIcon(NIM_DELETE,&m_traydata);
• CDialog::OnCancel();
•下面我们结合编程软件演示托盘菜单的实现过程