添加、移除托盘图标以及气泡提示

添加、移除托盘图标以及气泡提示

在头文件中声明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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值