初识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 }

 

posted @ 2015-04-30 16:14  netosoul  阅读(963)  评论(0)    收藏  举报