在头文件中声明NOTIFYICONDATA类型的m_tray结构,然后再类向导中添加WM_NOTIFYICON消息的处理函数,使用 Shell_NotifyIcon 操作托盘图标。 .h
public: BOOL AddRemoveTray(BOOL flag); NOTIFYICONDATA m_tray; BOOL ShowBubbleTip(LPCTSTR lpTitle, LPCTSTR lpText, DWORD infoflags); // 实现 protected: HICON m_hIcon; // 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg LRESULT OnNotifyicon(WPARAM wParam, LPARAM lParam);.cpp
BEGIN_MESSAGE_MAP(CTrayAndBubbleDlg, CDialogEx) ON_WM_PAINT() ON_MESSAGE(WM_NOTIFYICON, &CTrayAndBubbleDlg::OnNotifyicon) ON_WM_QUERYDRAGICON() END_MESSAGE_MAP() // CTrayAndBubbleDlg 消息处理程序 BOOL CTrayAndBubbleDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 AddRemoveTray(TRUE); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } BOOL CTrayAndBubbleDlg::AddRemoveTray(BOOL flag) { if (flag) { //static const GUID ic_guid = { 0x84d049ff, 0xb769, 0x434e, { 0x9f, 0x53, 0xbc, 0xf2, 0x98, 0x48, 0x25, 0xa9 } }; // ZeroMemory(&m_tray,sizeof(m_tray)); m_tray.cbSize = sizeof(NOTIFYICONDATA); m_tray.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1)); // (HICON)LoadImage(AfxGetInstanceHandle(),IDI_TRAY_ICON,IMAGE_ICON,0,0,LR_LOADFROMFILE);; m_tray.hWnd = m_hWnd; StringCchCopy(m_tray.szTip, sizeof(m_tray.szTip), _T("Test application")); m_tray.uCallbackMessage = WM_NOTIFYICON; m_tray.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; m_tray.uID = IDI_ICON1; //m_tray.uFlags |= NIF_GUID; //m_tray.guidItem = ic_guid; int count = 30; while (count > 0) { if (Shell_NotifyIcon(NIM_ADD, &m_tray) == FALSE)//添加 { Shell_NotifyIcon(NIM_DELETE, &m_tray); Sleep(100); count--; continue; } else return TRUE; } return FALSE; } else {//remove int count = 10; while (count > 0) { if (Shell_NotifyIcon(NIM_DELETE, &m_tray) == FALSE)//移除 { Sleep(50); count--; continue; } else return TRUE; } return FALSE; } } BOOL CTrayAndBubbleDlg::ShowBubbleTip(LPCTSTR lpTitle, LPCTSTR lpText, DWORD infoflags)//气泡 { m_tray.cbSize = sizeof(NOTIFYICONDATA); m_tray.uFlags |= NIF_INFO; m_tray.uTimeout = 10 * 1000; m_tray.dwInfoFlags = infoflags; m_tray.uVersion = NOTIFYICON_VERSION; StringCchCopy(m_tray.szInfoTitle, sizeof(m_tray.szTip), lpTitle); StringCchCopy(m_tray.szInfo, sizeof(m_tray.szTip), lpTitle); return Shell_NotifyIcon(NIM_MODIFY, &m_tray); } afx_msg LRESULT CTrayAndBubbleDlg::OnNotifyicon(WPARAM wParam, LPARAM lParam) { UINT nID = (UINT)wParam; UINT uMouseMsg = (UINT)lParam; switch (nID) { case IDI_ICON1: { if (uMouseMsg == WM_RBUTTONDOWN)//退出 { AddRemoveTray(FALSE); exit(0); } else if (uMouseMsg == WM_LBUTTONDOWN)//显示气泡 { ShowBubbleTip(_T("ShowBubbleTip Title"), _T("ShowBubbleTip Context."), NIIF_INFO); } } break; default: return 0; } return 0; }代码链接: VS2015工程:http://download.csdn.net/detail/yangyang031213/9893384 https://github.com/yangyang0312/cpp/tree/master/windows/TrayAndBubble
