初识MFC:给程序添加任务栏托盘(NOTIFYICONDATA)
环境:VS2012。
Step1:认识一个新的结构体:NOTIFYICONDATA。
NOTIFYICONDATA结构体中包含了任务栏托盘的信息。
我们框架中定义个这样的对象:
1 public: 2 NOTIFYICONDATA m_NotifyIconData;
因为需要用到窗口句柄,所以我们在创建结束时,设置此结构体:
1 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 2 { 3 if (CFrameWnd::OnCreate(lpCreateStruct) == -1) 4 return -1; 5 6 if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_BOTTOM | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC ) || 7 !m_wndToolBar.LoadToolBar(IDR_MYTOOLBAR)) 8 { 9 TRACE0("未能创建工具栏\n"); 10 return -1; // 未能创建 11 } 12 13 // TODO: 如果不需要可停靠工具栏,则删除这三行 14 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); 15 EnableDocking(CBRS_ALIGN_ANY); 16 DockControlBar(&m_wndToolBar); 17 18 //*********************************** 19 20 21 定义NotifyIconData员 22 m_NotifyIconData.cbSize = sizeof(m_NotifyIconData); 23 m_NotifyIconData.hWnd = m_hWnd; //与框架的窗口句柄进行关联 24 m_NotifyIconData.uID = UM_NOTIFYICONDATA; 25 m_NotifyIconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 26 m_NotifyIconData.uCallbackMessage = WM_COMMAND; 27 m_NotifyIconData.hIcon = AfxGetApp()->LoadIcon(IDI_CAMERA); 28 //这里的wcscpy_s为宽字符集函数,对应的C函数为strcpy_s 29 wcscpy_s( m_NotifyIconData.szTip , 64 , _T("截屏工具 V1.0") ); 30 31 //调用此函数来显示托盘 32 Shell_NotifyIcon( NIM_ADD , &m_NotifyIconData ); 33 34 35 return 0; 36 }
同时,我们也要记得,在退出程序时删除托盘:
1 void CMainFrame::OnClose() 2 { 3 // TODO: 在此添加消息处理程序代码和/或调用默认值 4 //调用此函数删除托盘 5 Shell_NotifyIcon( NIM_DELETE , &m_NotifyIconData ); 6 CFrameWnd::OnClose(); 7 }
Step2: 设置双击托盘,弹出主窗口;在托盘上,点击右键,弹出浮动菜单:
我们这里在框架的OnCommand函数中接获消息进行处理。因为托盘m_NotifyIconData在设置其内信息时,已经与框架的窗口句柄进行关联,此时对托盘处理的消息是被路由至框架的。
1 BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam) 2 { 3 // TODO: 在此添加专用代码和/或调用基类 4 5 //处理托盘消息 UM为用户定义的宏 6 if ( wParam == UM_NOTIFYICONDATA ) 7 { 8 //左键双击托盘 显示窗口 9 if ( lParam == WM_LBUTTONDBLCLK ) 10 { 11 //清除 DeskTop BMP 链表 12 this->ClearDeskTopList(); 13 //获取桌面 并放入链表中 14 this->GetDeskTopToList(); 15 //显示桌面 16 this->ShowWindow( SW_MAXIMIZE ); 17 } 18 //右键单击托盘 显示托盘浮动菜单 19 if ( lParam == WM_RBUTTONDOWN ) 20 { 21 //定义菜单,此次我们选择从资源中加载菜单 22 CMenu menu; 23 menu.LoadMenu(IDR_NOTIFYICONMENU); 24 //资源中的0号(第一个)菜单是我们需要的 25 CMenu * pMenu = menu.GetSubMenu(0); 26 //CMenu * pMenu = this->GetMenu()->GetSubMenu(0); 27 //获得鼠标焦点 28 CPoint point; 29 GetCursorPos(&point); 30 //显示菜单 31 pMenu->TrackPopupMenu( TPM_LEFTALIGN |TPM_RIGHTBUTTON , point.x , point.y , this ); 32 } 33 } 34 return CFrameWnd::OnCommand(wParam, lParam); 35 }

浙公网安备 33010602011771号