吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3982|回复: 3
收起左侧

[C&C++ 转载] MFC下托盘图标的实现和托盘菜单

[复制链接]
小可爱~ 发表于 2017-2-1 18:09
本帖最后由 小可爱~ 于 2017-2-1 18:11 编辑

对话框头文件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吾爱币 +1 热心值 +1 收起 理由
飘荡的心 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

qwertyui 发表于 2017-2-1 18:32
路过来学习了。
云中岳 发表于 2017-2-1 18:59
18261770390 发表于 2017-2-1 20:33
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 08:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表