MFC应用代码
+ -

MFC实现电脑托盘效果

2023-05-25 31 0

初始化代码

增加拖盘效果,添加图标,这里用我们程序自带的ICO ID,IDR_MAINFRAME,也可以自添加。
添加我们拖盘时的右键菜单

  1. m_menu.LoadMenu(IDR_MENU_TRAY);
  2. //在OnInitDialog方法中调用
  3. NOTIFYICONDATA data;
  4. data.cbSize = sizeof(NOTIFYICONDATA);//结构体的大小
  5. data.hWnd = this->m_hWnd;//接收托盘消息的窗口句柄 this是当前dialog
  6. data.uID = IDR_MAINFRAME;//定义的托盘图标ID
  7. data.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;//设置属性,下面的三个属性是否有效
  8. lstrcpyn(data.szTip, _T("单击右键显示菜单"), sizeof(_T("单击右键显示菜单")));//图标上的提示字符串
  9. data.uCallbackMessage = WM_ONTRAY;//自定义的消息,
  10. data.hIcon = ::LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));//显示在系统托盘上的图标
  11. Shell_NotifyIcon(NIM_ADD, &data);// 向任务栏的状态栏发送添加托盘图标的消息

添加自定义消息

  1. #define WM_ONTRAY WM_USER+1

使用类向导添加消息处理函数

  1. BEGIN_MESSAGE_MAP(CTestDlg, CDialogEx)
  2. ...
  3. ON_MESSAGE(WM_ONTRAY, &CTestDlg::OnTray)
  4. ON_COMMAND(IDM_SHOW_UI, &CTestDlg::OnShowUi) //菜单响应
  5. ON_COMMAND(IDM_EXIT_APP, &CTestDlg::OnExitApp) //菜单响应
  6. END_MESSAGE_MAP()

实现消息响应函数:

  1. LRESULT CTestDlg::OnTray(WPARAM wParam, LPARAM lParam)
  2. {
  3. UINT uMouseMsg = (UINT)lParam;
  4. if (uMouseMsg == WM_RBUTTONDOWN)
  5. {
  6. CMenu* pPopup = m_menu.GetSubMenu(0);
  7. CPoint point;
  8. GetCursorPos(&point);
  9. pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_VERTICAL,
  10. point.x, point.y, AfxGetApp()->m_pMainWnd, TPM_LEFTALIGN);
  11. }
  12. else if (uMouseMsg == WM_LBUTTONDBLCLK)
  13. {
  14. this->ShowWindow(SW_SHOW);
  15. }
  16. return 0;
  17. }

关闭消息HOOK

点击X退出时的消息过滤,在OnSysCommand中添加如下:

  1. void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
  2. {
  3. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  4. {
  5. CAboutDlg dlgAbout;
  6. dlgAbout.DoModal();
  7. }
  8. else if (nID == SC_MINIMIZE)//最小化,把他隐藏起来
  9. {
  10. this->ShowWindow(SW_HIDE);
  11. }
  12. else if (nID == SC_CLOSE)//最小化,把他隐藏起来
  13. {
  14. this->ShowWindow(SW_HIDE);
  15. }
  16. else
  17. {
  18. CDialogEx::OnSysCommand(nID, lParam);
  19. }
  20. }

程序退出时清理

当程序退出时会出现拖盘图标不清空的现象,可以在退出函数中增加如下代码:

  1. void CTestDlg::OnShowUi()
  2. {
  3. SendMessage(WM_SYSCOMMAND, SC_RESTORE, 0);
  4. }
  5. void CTestDlg::OnExitApp()
  6. {
  7. NOTIFYICONDATA nd;
  8. nd.cbSize = sizeof(NOTIFYICONDATA);
  9. nd.hWnd = m_hWnd;
  10. nd.uID = IDR_MAINFRAME;
  11. Shell_NotifyIcon(NIM_DELETE, &nd);
  12. SendMessage(WM_CLOSE, 0, 0);
  13. }

参考:https://blog.51cto.com/xiaohaiwa/5891182

0 篇笔记 写笔记

MFC实现电脑托盘效果
初始化代码增加拖盘效果,添加图标,这里用我们程序自带的ICO ID,IDR_MAINFRAME,也可以自添加。添加我们拖盘时的右键菜单 m_menu.LoadMenu(IDR_MENU_TRAY); //在OnInitDialog方法中调用 NOTIFYICONDATA ......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!