VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 207|回复: 0

VC++高级班之窗口篇-[17]实现任务栏托盘与气泡提示

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-3-12 16:04:03 | 显示全部楼层 |阅读模式
----------------------------------------------------------------------------------------
①、为程序添加任务栏托盘:
1、定义托盘消息ID:
  1. #define WM_TRAY_MSG (WM_USER+100)
复制代码

2、对 Shell_NotifyIcon 函数进行封装,实现对托盘的操作:
  1. BOOL CDrawTestDlg::TrayMyIcon(BOOL bTrayIcon, LPCTSTR lpszTipMsg, int iShowWnd)
  2. {
  3.         NOTIFYICONDATA tnd = {0};
  4.         tnd.cbSize = sizeof(NOTIFYICONDATA);
  5.         tnd.hWnd = GetSafeHwnd();
  6.         tnd.uID = IDR_MAINFRAME;
  7.         DWORD dwMsg = 0;

  8.         if ( bTrayIcon == TRUE ) {
  9.                 tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
  10.                 tnd.uCallbackMessage = WM_TRAY_MSG;
  11.                 tnd.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
  12.                 if (lpszTipMsg && _tcslen(lpszTipMsg) > 0) {
  13.                         _tcscpy_s(tnd.szTip, sizeof(tnd.szTip)/sizeof(tnd.szTip[0]), lpszTipMsg);
  14.                 }
  15.                 dwMsg = NIM_ADD;
  16.         }else{
  17.                 dwMsg = NIM_DELETE;
  18.         }

  19.         if (iShowWnd == TRUE){
  20.                 ShowWindow(SW_SHOWNA);
  21.                 SetForegroundWindow();
  22.         }else if (iShowWnd == FALSE){
  23.                 ShowWindow(SW_MINIMIZE);
  24.                 ShowWindow(SW_HIDE);
  25.         }

  26.         return Shell_NotifyIcon(dwMsg, &tnd);
  27. }
复制代码


3、消息响应函数的添加:
  1. LRESULT CDrawTestDlg::OnTrayMsg(WPARAM wParam, LPARAM lParam)
  2. {
  3.         switch(lParam)
  4.         {
  5.         case WM_RBUTTONUP:
  6.                 {
  7.                         CPoint pt;
  8.                         CMenu mMenu, *pMenu = NULL;
  9.                         mMenu.LoadMenu(IDR_MENU1);
  10.                         pMenu = mMenu.GetSubMenu(0);
  11.                         GetCursorPos(&pt);
  12.                         SetForegroundWindow();
  13.                         pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this);
  14.                         break;
  15.                 }
  16.         case WM_LBUTTONDBLCLK:
  17.                 TrayMyIcon(FALSE);
  18.                 break;
  19.         default:break;
  20.         }
  21.         return TRUE;
  22. }
复制代码


4、消息映射的添加:
  1. ON_MESSAGE(WM_TRAY_MSG, &CDrawTestDlg::OnTrayMsg)
复制代码

===================================================
②、解决任务管理器重启托盘图标消失问题:
1、注册 TaskbarCreated 消息:
const UINT WM_TASKBARCREATED = ::RegisterWindowMessage(_T("TaskbarCreated"));
2、消息响应函数的实现:
  1. LRESULT CDrawTestDlg::OnTaskBarCreated(WPARAM wParam, LPARAM lParam)
  2. {
  3.         TrayMyIcon(TRUE, _T("托盘测试"));
  4.         return TRUE;
  5. }
复制代码

3、关联:ON_REGISTERED_MESSAGE(WM_TASKBARCREATED, &CDrawTestDlg::OnTaskBarCreated)
===================================================
③、增加气泡提示功能(XP下不显示的问题解决方法):
  1. BOOL CDrawTestDlg::TrayMyIcon(BOOL bTrayIcon, LPCTSTR lpszTipMsg, int iShowWnd)
  2. {
  3.         NOTIFYICONDATA tnd = {0};
  4.         tnd.cbSize = sizeof(NOTIFYICONDATA);
  5.         tnd.hWnd = GetSafeHwnd();
  6.         tnd.uID = IDR_MAINFRAME;
  7.         DWORD dwMsg = 0;

  8.         if ( bTrayIcon == TRUE ) {
  9.                 //NIF_INFO 为气球提示
  10.                 tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP | NIF_INFO;
  11.                 tnd.uCallbackMessage = WM_TRAY_MSG;
  12.                 tnd.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
  13.                 if (lpszTipMsg && _tcslen(lpszTipMsg) > 0) {
  14.                         _tcscpy_s(tnd.szTip, sizeof(tnd.szTip)/sizeof(TCHAR), lpszTipMsg);
  15.                 }
  16.                 dwMsg = NIM_ADD;
  17.         }else{
  18.                 dwMsg = NIM_DELETE;
  19.         }

  20.         _tcscpy_s(tnd.szInfoTitle, sizeof(tnd.szInfoTitle)/sizeof(tnd.szInfoTitle[0]), _T("气球提示标题"));
  21.         _tcscpy_s(tnd.szInfo, sizeof(tnd.szInfo)/sizeof(tnd.szInfo[0]), _T("这是一个气球提示,内容显示在这!"));

  22.         if (iShowWnd == TRUE){
  23.                 ShowWindow(SW_SHOWNA);
  24.                 SetForegroundWindow();
  25.         }else if (iShowWnd == FALSE){
  26.                 ShowWindow(SW_MINIMIZE);
  27.                 ShowWindow(SW_HIDE);
  28.         }

  29.         return Shell_NotifyIcon(dwMsg, &tnd);
  30. }
复制代码

===================================================
④、点击按钮进行气泡提示:
  1. void CDrawTestDlg::OnBnClickedStartBtn()
  2. {
  3.         NOTIFYICONDATA tnd = {0};
  4.         tnd.cbSize = sizeof(NOTIFYICONDATA);
  5.         tnd.hWnd = GetSafeHwnd();
  6.         tnd.uID = IDR_MAINFRAME;
  7.         tnd.uFlags = NIF_INFO;
  8.         tnd.dwInfoFlags = NIIF_INFO;
  9.         _tcscpy_s(tnd.szInfoTitle, sizeof(tnd.szInfoTitle)/sizeof(tnd.szInfoTitle[0]), _T("气球提示标题"));
  10.         _tcscpy_s(tnd.szInfo, sizeof(tnd.szInfo)/sizeof(tnd.szInfo[0]), _T("这是一个气球提示,内容显示在这!"));
  11.         Shell_NotifyIcon(NIM_MODIFY, &tnd);
  12. }
复制代码

===================================================
⑤、MFC对话框程序初始化最小化,不闪的完美效果:
1、主对话框弹出方式改成非模态:
  1. dlg.Create(IDD_DRAWTEST_DIALOG);
  2. //dlg.ShowWindow(SW_SHOW);
  3. dlg.RunModalLoop();
复制代码


2、重载对话框的 OnCancel() 函数,改写代码:
  1. void CDrawTestDlg::OnCancel()
  2. {
  3.         DestroyWindow();
  4.         //CDialog::OnCancel();
  5. }
复制代码


3、对话框模版的 Visible 属性设置为:FALSE
4、在程序运行的过程中,想显示的地方调用 ShowWindow 即可!
===================================================
※※※ 小作业:
1、菜单响应函数的功能添加留给大家看后去做!
2、如果大家有时间的话,可以试着做下任务栏图标的动态改变!
提示:Shell_NotifyIcon(NIM_MODIFY, &tnd),同时可以使用定时器 Timer 辅助实现!
------------------------------------- End -------------------------------------------------
相关课程演示细节还请观看视频教程!
本套教程由VC驿站原创,提供视频教程+售后答疑服务!
教程介绍及详情请见:http://www.cctry.com/static/vip/index.html
VC驿站Vip会员详情请见:http://www.cctry.com/static/vip/index.html




上一篇:VC++高级班之窗口篇-[16]实现对话框的自适应最大化功能
下一篇:VC++高级班之窗口篇-[18]动态创建按钮及响应

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-7-17 05:47

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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