MFC下托盘图标的实现和托盘菜单

转载自:http://blog.csdn.net/longsir2008/article/details/6304130


对话框头文件XXXDlg.h:

1.添加成员变量NOTIFYICONDATA m_nid;

2.添加tray消息响应函数的声明

afx_msg LRESULT OnTrayNotify(WPARAM wParam, LPARAM lParam);

对话框实现文件XXXDlg.cpp:

1.定义tray消息 #define UM_TRAYNOTIFY WM_USER + 11

2.CXXXDlg的构造函数添加

 memset(&m_nid, 0, sizeof(m_nid)); // Initialize NOTIFYICONDATA struct
 m_nid.cbSize = sizeof(m_nid);
 m_nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;

3.CXXXDlg的析构函数添加

 m_nid.hIcon = NULL;
 Shell_NotifyIcon(NIM_DELETE, &m_nid);

4.添加消息映射:

BEGIN_MESSAGE_MAP(CMFC2Dlg, CDialog)
 //...
 ON_MESSAGE(UM_TRAYNOTIFY, &CMFC2Dlg::OnTrayNotify)
 //...
END_MESSAGE_MAP() 

5.OnInitDialog函数添加:

m_nid.hWnd = GetSafeHwnd();
 m_nid.uCallbackMessage = UM_TRAYNOTIFY;

 // Set tray icon and tooltip
 m_nid.hIcon = m_hIcon;

 // Set tray notification tip information
 CString strToolTip = _T("托盘程序");
 _tcsncpy_s(m_nid.szTip, strToolTip, strToolTip.GetLength());
 Shell_NotifyIcon(NIM_ADD, &m_nid);

6.OnTrayNotify函数的实现:
LRESULT CXXXDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
 UINT uMsg = (UINT)lParam;

 switch(uMsg)
 {
 case WM_RBUTTONUP:
  {
   //右键处理
  CMenu menuTray;
  CPoint point;
  int id;
  GetCursorPos(&point);
  
  menuTray.LoadMenu(IDR_MENU_TRAY);
  id = menuTray.GetSubMenu(0)->TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this);
#if 0
  CString strInfo;
  strInfo.Format(L"menuid %d", id);
  LPCTSTR strtmp;
  strtmp = strInfo.GetBuffer(0);
  MessageBox(strtmp, L"test");
#endif
  switch(id){
   case IDR_TRAY_EXIT:
    OnOK();
    break;
   case IDR_TRAY_RESTORE:

    //窗口前端显示
    SetForegroundWindow();
    ShowWindow(SW_SHOWNORMAL);
    break;
   default:
    break;
  }
  break;
  }
 case WM_LBUTTONDBLCLK:
  SetForegroundWindow();
  ShowWindow(SW_SHOWNORMAL);
  break;
 default:
  break;
 }
 return 0;
}

7.添加WM_SIZE消息处理:

void CMFC2Dlg::OnSize(UINT nType, int cx, int cy)
{
 CDialog::OnSize(nType, cx, cy);

 if(nType == SIZE_MINIMIZED){
  ShowWindow(SW_HIDE);
 }

}
8.菜单。

添加菜单资源 , 比如IDR_MENU_TRAY.

定义一个子菜单Tray,有若干个菜单项,比如“恢复窗口”, ID是IDR_TRAY_RESTORE,“退出”, ID是IDR_TRAY_EXIT

在OnTrayNotify函数中捕获右击消息,弹出菜单,参考第6步。

 

至此,添加托盘的功能基本完成。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值