首页 > 技术文章 > MFC程序最小化到托盘

kingbin 2014-10-21 13:41 原文

1、在资源中的Icon中导入一个自己喜欢的图标,ID命名为IDR_MAINFRAME,将先前的IDR_MAINFRAME的图标删除掉;

2、在自己的Dialog头文件中定义一个变量  NOTIFYICONDATA m_nid,关于该结构体的具体信息可以查阅MSDN;

3、添加消息响应函数OnInitDialog(),并在该函数中添加以下代码,这样程序一启动,就在托盘中显示出了自己应用程序的图标。

  

 1   //---------------------------托盘显示---------------------------------//
 2 
 3     m_nid.cbSize  = (DWORD)sizeof(NOTIFYICONDATA);
 4 
 5     m_nid.hWnd    = this->m_hWnd;
 6 
 7     m_nid.uID     = IDR_MAINFRAME;
 8 
 9     m_nid.uFlags  = NIF_ICON | NIF_MESSAGE | NIF_TIP ;
10 
11     m_nid.uCallbackMessage = WM_SHOWTASK; // 自定义的消息名称
12 
13     m_nid.hIcon   = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
14 
15     strcpy(m_nid.szTip, "服务器程序"); // 信息提示条为"服务器程序",VS2008 UNICODE编码用wcscpy_s()函数
16 
17     Shell_NotifyIcon(NIM_ADD, &m_nid);// 在托盘区添加图标

    这时候编译,会报WM_SHOWTASK的错,因为该消息要自己定义。

4、在Dialog头文件中声明消息函数原型                                         

   

 LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);

 

5、在Dialog源文件中进行消息映射

   

 ON_MESSAGE(WM_SHOWTASK,OnShowTask)

 

6、在Dialog源文件中添加自定义的消息响应代码,左键双击弹出应用程序主窗口,右键单击弹出菜单。

   

 1  LRESULT CServerDlg::OnShowTask(WPARAM wParam, LPARAM lParam)
 2     {
 3            if(wParam != IDR_MAINFRAME)
 4                   return 1;
 5            switch(lParam)
 6            {
 7            case WM_RBUTTONUP: // 右键起来时弹出菜单
 8                   {                
 9                          LPPOINT lpoint = new tagPOINT;
10                          ::GetCursorPos(lpoint);// 得到鼠标位置
11                          CMenu menu;
12                          menu.CreatePopupMenu();// 声明一个弹出式菜单
13                          menu.AppendMenu(MF_STRING, WM_DESTROY, "关闭");
14                          menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x ,lpoint->y, this);
15                          HMENU hmenu = menu.Detach();
16                          menu.DestroyMenu();
17                          delete lpoint;
18                   }
19                   break;
20            case WM_LBUTTONDBLCLK: // 双击左键的处理
21                   {
22                          this->ShowWindow(SW_SHOWNORMAL);// 显示主窗口
23                   }
24 
25                   break;
26            }
27            return 0;
28     }

 

7、添加OnSize消息响应函数,处理最小化时的操作。

   

1  void CServerDlg::OnSize(UINT nType, int cx, int cy)
2     {
3            CDialog::OnSize(nType, cx, cy);
4            if(nType == SIZE_MINIMIZED)  
5            {  
6                   ShowWindow(SW_HIDE); // 当最小化市,隐藏主窗口   
7            }  
8     }

 

8、添加关闭窗口时的消息响应函数,将托盘中的应用程序图标删除

   

1  BOOL CServerDlg::DestroyWindow()
2     { 
3            // 在托盘区删除图标
4            Shell_NotifyIcon(NIM_DELETE, &m_nid);             
5            return CDialog::DestroyWindow();
6     }

 

推荐阅读