MFC实现任务栏提示区图标的显示

一、一个简单的直接引用的方法:
我们可以使用直接引用WIN32 API函数的方法实现任务栏提示区图标。
1
、定义一个NOTIFYICONDATA数据结构,初始化各数据项。其结构详见在线帮助。
2
、使用WIN32 API函数Shell_NotifyIcon实现任务栏提示区图标。函数原形如下:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon
DWORD dwMessage//消息类型
PNOTIFYICONDATA pnid //
指向NOTIFYICONDATA结构的指针
);
消息类型包括:NIM_ADD 增加图标到任务栏;
NIM_DELETE
从任务栏删除图标;
NIM_MODIFY
修改任务栏图标;
二、一个更好的面对对象的方法:

为了使使用更加方便、合理,更符合面对对象的处理方法,我们应当封装一个类
CSystemIcon),由此类实现任务栏提示区图标。

// SystemIcon.h : header file 
// 
#ifndef _INCLUDED_SYSTEMICON_H_ 
#define _INCLUDED_SYSTEMICON_H_ 
///// 
// CSystemIcon window 
class CSystemIcon : public CObject 
{
    // Construction/destruction 
public: 
    CSystemIcon(); 
    CSystemIcon(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szTip, HICON icon, UINT uID); 
    virtual ~CSystemIcon(); 
    // Operations 
public: 
    BOOL Enabled() { return m_bEnabled; } 
    BOOL Visible() { return !m_bHidden; } 
    //创建系统图标 
    Create(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szTip, HICON icon, UINT uID); 
    //关于提示文本 
    BOOL SetTooltipText(LPCTSTR pszTooltipText); 
    BOOL SetTooltipText(UINT nID); 
    CString GetTooltipText() const; 
    //关于图标 
    BOOL SetIcon(HICON hIcon); 
    BOOL SetIcon(LPCTSTR lpIconName); 
    BOOL SetIcon(UINT nIDResource); 
    BOOL SetStandardIcon(LPCTSTR lpIconName); 
    BOOL SetStandardIcon(UINT nIDResource); 
    HICON GetIcon() const; 
    void HideIcon(); 
    void ShowIcon(); 
    void DeleteIcon(); 
    //关于通知窗口 
    BOOL SetNotificationWnd(CWnd* pNotifyWnd); 
    CWnd* GetNotificationWnd() const; 
    //自定义消息处理函数 
    virtual LRESULT OnIconNotification(WPARAM uID, LPARAM lEvent); 
    // Overrides 
    // ClassWizard generated virtual function overrides 
    //{{AFX_VIRTUAL(CSystemIcon) 
    //}}AFX_VIRTUAL 
    // Implementation 
protected: 
    BOOL m_bEnabled; //是否支持图标 
    BOOL m_bHidden; //是否隐藏图标 
    NOTIFYICONDATA m_tnd; //数据结构,请参考在线帮助 
    DECLARE_DYNAMIC(CSystemIcon) 
}; 
#endif 
///// 
// SystemIcon.cpp : implementation file 
#include "stdafx.h" 
#include "SystemIcon.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
IMPLEMENT_DYNAMIC(CSystemIcon, CObject) 
///// 
CSystemIcon::CSystemIcon()
{
    
    memset(&m_tnd, 0, sizeof(m_tnd)); 
    m_bEnabled = FALSE; 
    m_bHidden = FALSE; 
} 
CSystemIcon::CSystemIcon(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szToolTip, 
                         HICON icon, UINT uID) 
{
    
    Create(pWnd, uCallbackMessage, szToolTip, icon, uID); 
    m_bHidden = FALSE; 
}
BOOL CSystemIcon::Create(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szToolTip, 
                         HICON icon, UINT uID) 
{
    
    //文件只能使用在WINDOW 95以上的版本中 
    VERIFY(m_bEnabled = ( GetVersion() & 0xff ) >= 4); 
    if (!m_bEnabled) return FALSE; 
    //确认通知窗口有效 
    VERIFY(m_bEnabled = (pWnd && ::IsWindow(pWnd->GetSafeHwnd()))); 
    if (!m_bEnabled) return FALSE; 
    //确认自定义消息大于WM_USER 
    ASSERT(uCallbackMessage >= WM_USER); 
    //确定提示文本长度小于64 
    ASSERT(_tcslen(szToolTip) <= 64); 
    //定义NOTIFYICONDATA结构的数据项 
    m_tnd.cbSize = sizeof(NOTIFYICONDATA); 
    m_tnd.hWnd = pWnd->GetSafeHwnd(); 
    m_tnd.uID = uID; 
    m_tnd.hIcon = icon; 
    m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 
    m_tnd.uCallbackMessage = uCallbackMessage; 
    strcpy (m_tnd.szTip, szToolTip); 
    //设置图标 
    VERIFY(m_bEnabled = Shell_NotifyIcon(NIM_ADD, &m_tnd)); 
    return m_bEnabled; 
}
CSystemIcon::~CSystemIcon() 
{
    DeleteIcon(); 
}

///// 
void CSystemIcon::DeleteIcon() 
{
    
    
    if (!m_bEnabled) return; 
    m_tnd.uFlags = 0; 
    Shell_NotifyIcon(NIM_DELETE, &m_tnd); 
    m_bEnabled = FALSE; 
}
void CSystemIcon::HideIcon() 
{
    
    
    if (m_bEnabled && !m_bHidden) 
    { 
        m_tnd.uFlags = NIF_ICON; 
        Shell_NotifyIcon (NIM_DELETE, &m_tnd); 
        m_bHidden = TRUE;
    }
}
void CSystemIcon::ShowIcon()
{
    
    
    if (m_bEnabled && m_bHidden) 
    { 
        m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 
        Shell_NotifyIcon(NIM_ADD, &m_tnd); 
        m_bHidden = FALSE; 
    }
}
BOOL CSystemIcon::SetIcon(HICON hIcon) 
{
    
    
    if (!m_bEnabled) return FALSE; 
    m_tnd.uFlags = NIF_ICON; 
    m_tnd.hIcon = hIcon; 
    return Shell_NotifyIcon(NIM_MODIFY, &m_tnd); 
}
BOOL CSystemIcon::SetIcon(LPCTSTR lpszIconName) 
{
    
    
    HICON hIcon = AfxGetApp()->LoadIcon(lpszIconName); 
    return SetIcon(hIcon); 
}
BOOL CSystemIcon::SetIcon(UINT nIDResource) 
{
    
    
    HICON hIcon = AfxGetApp()->LoadIcon(nIDResource); 
    return SetIcon(hIcon); 
}
BOOL CSystemIcon::SetStandardIcon(LPCTSTR lpIconName) 
{
    
    
    HICON hIcon = LoadIcon(NULL, lpIconName); 
    return SetIcon(hIcon); 
}
BOOL CSystemIcon::SetStandardIcon(UINT nIDResource) 
{
    
    
    HICON hIcon = LoadIcon(NULL, MAKEINTRESOURCE(nIDResource)); 
    return SetIcon(hIcon); 
}
HICON CSystemIcon::GetIcon() const 
{
    
    
    HICON hIcon = NULL; 
    if (m_bEnabled) 
        hIcon = m_tnd.hIcon; 
    return hIcon; 
}
BOOL CSystemIcon::SetTooltipText(LPCTSTR pszTip) 
{
    
    
    if (!m_bEnabled) return FALSE; 
    m_tnd.uFlags = NIF_TIP; 
    _tcscpy(m_tnd.szTip, pszTip); 
    return Shell_NotifyIcon(NIM_MODIFY, &m_tnd); 
}
BOOL CSystemIcon::SetTooltipText(UINT nID) 
{
    
    
    CString strText; 
    VERIFY(strText.LoadString(nID)); 
    return SetTooltipText(strText); 
}
CString CSystemIcon::GetTooltipText() const 
{
    CString strText; 
    if (m_bEnabled) 
        strText = m_tnd.szTip; 
    return strText; 
}

BOOL CSystemIcon::SetNotificationWnd(CWnd* pWnd) 
{
    
    
    if (!m_bEnabled) return FALSE; 
    ASSERT(pWnd && ::IsWindow(pWnd->GetSafeHwnd())); 
    m_tnd.hWnd = pWnd->GetSafeHwnd(); 
    m_tnd.uFlags = 0; 
    return Shell_NotifyIcon(NIM_MODIFY, &m_tnd); 
}
CWnd* CSystemIcon::GetNotificationWnd() const 
{
    
    
    return CWnd::FromHandle(m_tnd.hWnd); 
}

LRESULT CSystemIcon::OnIconNotification(WPARAM wParam, LPARAM lParam) 
{
    
    
    if (wParam != m_tnd.uID) 
        return 0L; 
    CMenu menu, *pSubMenu; 
    //单击右键弹出菜单 
    if (LOWORD(lParam) == WM_RBUTTONUP) 
    {
        if (!menu.LoadMenu(m_tnd.uID)) return 0; 
        if (!(pSubMenu = menu.GetSubMenu(0))) return 0; 
        //设定第一项为缺省 
        ::SetMenuDefaultItem(pSubMenu->m_hMenu, 0, TRUE); 
        //定义弹出菜单 
        CPoint pos; 
        GetCursorPos(&pos); 
        ::SetForegroundWindow(m_tnd.hWnd); 
        ::TrackPopupMenu(pSubMenu->m_hMenu, 0, pos.x, pos.y, 0, m_tnd.hWnd, NULL); 
        ::PostMessage(m_tnd.hWnd, WM_NULL, 0, 0); 
        menu.DestroyMenu(); 
    }
    else if (LOWORD(lParam) == WM_LBUTTONDBLCLK) 
    {
        if (!menu.LoadMenu(m_tnd.uID)) return 0; 
        if (!(pSubMenu = menu.GetSubMenu(0))) return 0; 
        //双击左键起动缺省菜单 
        ::SetForegroundWindow(m_tnd.hWnd); 
        ::SendMessage(m_tnd.hWnd, WM_COMMAND, pSubMenu->GetMenuItemID(0), 0); 
        menu.DestroyMenu(); 
            
    }
    return 1; 
}

三、一个简单的例子
1
、使用MFC AppWizard(EXE)创建项目文件。
2
、用Add to Project添加CSystemIcon类的.h文件与.CPP文件到工程中。
3
、在CFrameWnd类中添加下列语句:
//
自定义消息
#define WM_ICON_NOTIFY WM_USER+10
//
定义成员变量
#include "SystemIcon.h"
CSystemIcon m_systemIcon
4
、定义消息映象与消息处理函数
a
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
...
ON_MESSAGE(WM_ICON_NOTIFY, OnIconNotification)
END_MESSAGE_MAP()
b
LRESULT CMainFrame::OnIconNotification(WPARAM wParam, LPARAM lParam)
return m_systemIcon.OnIconNotification(wParam, lParam);
c
、定义LRESULT OnIconNotification(WPARAM wParam, LPARAM lParam)
5
、创建系统图标(在OnCreate中加添加):
HICON hIcon=AfxGetApp()->LoadIcon(IDI_MAINFRAME);
if (!m_systemIcon.Create(this, //
消息通知窗口
WM_ICON_NOTIFY,//
自定义消息
"MY SAMPLE", //
提示字符串
hIcon, //
图标ID
IDR_POPUP_MENU //
弹出菜单ID
))
return -1;
6
、打开资源,创建弹出菜单(IDR_POPUP_MENU),CAPTION(_POPUP_):
菜单项包括:a、关于(ID_APP_ABOUT) b、例子(ID_APP_APP) c、退出(ID_APP_EXIT)
ClassWizard定义(ID_APP_APP)消息处理函数,添加:AfxGetMainWnd()->ShowWindow(SW_SHOW);
7
、打开资源,创建图标(IDI_ICON1)。
8
、删除应用类中的函数InitInstance中的pMainFrame->ShowWindow(m_nCmdShow)语句。
9
、编译执行形成执行文件。
四、实现图标闪烁(利用定时器)

void OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default
switch(nIDEvent)
{
case 1:
m_systemIcon.SetIcon(IDI_ICON1);
Sleep(300);
SetTimer(2,300,NULL);
case 2:
m_systemIcon.SetIcon(IDR_MAINFRAME);
SetTimer(1,300,NULL);
}
CDialog::OnTimer(nIDEvent);
}

 

 

 


 

转载于:https://www.cnblogs.com/renhang888/archive/2012/06/24/2559650.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值