任务栏提示区图标的显示"/>
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); }
转载于:.html
更多推荐
MFC实现任务栏提示区图标的显示
发布评论