C++对话框系统托盘实现

jopen 12年前

背景需求:

1、MFC对话框最小化时,只显示系统右下角托盘图标。

2、双击托盘,对话框还原。

3、右键点击托盘,弹出“关闭”菜单,可关闭对话框。

 

实现步骤:

1、创建MFC对话框程序(本例程序名为TaskbarIcon),属性中设置“MinimizeBox”为true。

2、定义自定义消息宏。

#define NOTIFY_SHOW WM_USER+2500

3、OnSysCommand(系统消息响应函数)添加对话框最小化执行代码。

void CTaskbarIconDlg::OnSysCommand(UINT nID, LPARAM lParam)  {      if (SC_MINIMIZE == nID)      {          NOTIFYICONDATA nid;          nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);             nid.hWnd = this->m_hWnd;             nid.uID = IDR_MAINFRAME;             nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP   ;             nid.uCallbackMessage = NOTIFY_SHOW;//自定义的消息名称          nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));             wcscpy_s(nid.szTip, _T("图标测试"));//信息提示条            Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标          ShowWindow(SW_HIDE);//隐藏主窗口          return;      }        //...系统自带代码  }

4、托盘自定义消息响应

BEGIN_MESSAGE_MAP(CTaskbarIconDlg, CDialog)      //...省略其他消息映射        ON_MESSAGE(NOTIFY_SHOW, OnTrayIcon)      //}}AFX_MSG_MAP  END_MESSAGE_MAP()    afx_msg LRESULT OnTrayIcon(WPARAM wParam, LPARAM lParam);    LRESULT CTaskbarIconDlg::OnTrayIcon(WPARAM wParam, LPARAM lParam)  {      if (wParam != IDR_MAINFRAME)      {          return 1;      }            switch(lParam)      {      case WM_RBUTTONUP:          {              //右键起来时弹出快捷菜单,这里只有一个“关闭”                //声明一个弹出式菜单              //增加菜单项“关闭”,点击则发送消息WM_CLOSE给主窗口(已                 //隐藏),将程序结束。               CMenu menu;              menu.CreatePopupMenu();              menu.AppendMenu(MF_STRING, ID_APP_EXIT, _T("关闭"));                //得到鼠标位置              LPPOINT lpoint= new tagPOINT;              ::GetCursorPos(lpoint);                //确定弹出式菜单的位置                 menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x, lpoint->y,this);                //资源回收              HMENU   hmenu=menu.Detach();              menu.DestroyMenu();                delete lpoint;              lpoint = NULL;                break;          }      case WM_LBUTTONDBLCLK:          {              //双击左键的处理                //显示界面              ShowWindow(SW_SHOW);              //界面置顶              SetForegroundWindow();                break;          }      }        return 0;  }

5、关闭时删除托盘图标。

覆盖(override)OnCancel函数。

virtual void OnCancel();    void CTaskbarIconDlg::OnCancel()  {      //删除任务栏图标      NOTIFYICONDATA nid;      nid.hWnd=this->m_hWnd;      nid.uID=IDR_MAINFRAME;      Shell_NotifyIcon(NIM_DELETE, &nid);        CDialog::OnCancel();  }