关于在MFC中将窗口最小化到托盘

关于在MFC中将窗口最小化到托盘
(一) 原理
  1、最小化的原理:首先要将窗口隐藏,然后在右下角绘制图标。
  2、恢复的原理:将窗口显示,再将托盘中的图片删除。

(二)程序实现
  1、自定义消息WM_SHOWTASK: 

1  #define  WM_SHOWTASK (WM_USER +1)

 

   2、在MFC的 

1  ::OnSysCommand(UINT nID, LPARAM lParam) 函数体中增加一个命令响应
2  if (nID == SC_MINIMIZE)
3  ToTray();  // 最小化到托盘的函数

   3、在消息映射中添加  

1  ON_MESSAGE(WM_SHOWTASK,OnShowTask);  // 其中WM_SHOWTASK是消息名,
2  OnShowTask是自己定义的消息响应函数,后面有说明。

(三)具体函数内容
1、最小化到托盘函数 

 1  void  CMyDlg::ToTray()
 2  {
 3    NOTIFYICONDATA nid;
 4    nid.cbSize = (DWORD) sizeof (NOTIFYICONDATA);
 5    nid.hWnd = this -> m_hWnd;
 6    nid.uID = IDR_MAINFRAME;
 7    nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ;
 8    nid.uCallbackMessage = WM_SHOWTASK; // 自定义的消息名称
 9    nid.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
10    strcpy(nid.szTip, " 程序名称 " );  // 信息提示条
11    Shell_NotifyIcon(NIM_ADD, & nid);  // 在托盘区添加图标
12    ShowWindow(SW_HIDE);  // 隐藏主窗口
13  }

 

2、恢复界面函数

 1  在头文件中定义消息响应函数
 2  afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam) ;
 3  // wParam接收的是图标的ID,而lParam接收的是鼠标的行为
 4  LRESULT CMyDlg::OnShowTask(WPARAM wParam,LPARAM lParam)
 5  {
 6     if (wParam != IDR_MAINFRAME)
 7     return   1 ;
 8     switch (lParam)
 9    {
10         case  WM_RBUTTONUP: // 右键起来时弹出快捷菜单,这里只有一个“关闭”
11    {
12        LPPOINT lpoint = new  tagPOINT;
13        ::GetCursorPos(lpoint); // 得到鼠标位置
14        CMenu menu;
15        menu.CreatePopupMenu(); // 声明一个弹出式菜单
16        menu.AppendMenu(MF_STRING,WM_DESTROY, " 关闭 " );  // 增加菜单项“关闭”,点击则发送消息  WM_DESTROY给主窗口(已隐藏),将程序结束。
17        menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint -> x,lpoint -> y, this );  // 确定弹出式菜单的位置
18        HMENU hmenu = menu.Detach();
19        menu.DestroyMenu();  // 资源回收
20        delete lpoint;
21    }  break ;
22     case  WM_LBUTTONDBLCLK:  // 双击左键的处理
23    {
24         this -> ShowWindow(SW_SHOW); // 简单的显示主窗口完事儿
25        DeleteTray();
26    }  break ;
27     default break ;
28    }
29         return   0 ;
30    }

3、删除托盘图标函数 

 1  void  CMyDlg::DeleteTray()
 2  {
 3    NOTIFYICONDATA nid;
 4    nid.cbSize = (DWORD) sizeof (NOTIFYICONDATA);
 5    nid.hWnd = this -> m_hWnd;
 6    nid.uID = IDR_MAINFRAME;
 7    nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ;
 8    nid.uCallbackMessage = WM_SHOWTASK;  // 自定义的消息名称
 9    nid.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
10    strcpy(nid.szTip, " 程序名称 " );  // 信息提示条为“计划任务提醒”
11    Shell_NotifyIcon(NIM_DELETE, & nid);  // 在托盘区删除图标
12  }

 

你可能感兴趣的:(关于在MFC中将窗口最小化到托盘)