如何把图标放在托盘中!

97341119 2001-02-13 05:08:00
刚来请多多指教!
...全文
192 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
97341119 2001-02-14
  • 打赏
  • 举报
回复
谢谢大家
Kaile 2001-02-13
  • 打赏
  • 举报
回复
还要能响应左键右键单双击消息
firfang 2001-02-13
  • 打赏
  • 举报
回复
十分正确,就是Shell_NotifyIcon函数 ,是一个Windows API,有很多书上讲这个例子的。
在用的时候,还要注意设置前后窗口,一句两句说不清楚,你还是找本书看看吧!
随风bj 2001-02-13
  • 打赏
  • 举报
回复
给你一个类吧(还能用切换图标):
头文件:
////////////////////////////////// Macros ///////////////////////////
#ifndef _NTRAY_H__
#define _NTRAY_H__
/////////////////////////// Classes /////////////////////////////////
//forward declaration
class CTrayNotifyIcon;

//internal class used to handle IE4 taskbar creation notification message
class CTrayRessurectionWnd : public CFrameWnd
{
public:
//Constructors / Destructors
CTrayRessurectionWnd(CTrayNotifyIcon* pTrayIcon);

protected:
CTrayNotifyIcon* m_pTrayIcon;

//{{AFX_MSG(CTrayRessurectionWnd)
//}}AFX_MSG
afx_msg LRESULT OnTaskbarCreated(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()

DECLARE_DYNAMIC(CTrayRessurectionWnd)
};



//internal class used to implement animated tray icons
class CTrayTimerWnd : public CFrameWnd
{
public:
//Constructors / Destructors
CTrayTimerWnd(CTrayNotifyIcon* pTrayIcon, HICON* phIcons, int nNumIcons, DWORD dwDelay);
~CTrayTimerWnd();

//retreive the current icon
HICON GetCurrentIcon() const { return m_phIcons[m_nCurrentIconIndex]; };

protected:
CTrayNotifyIcon* m_pTrayIcon;
HICON* m_phIcons;
int m_nNumIcons;
DWORD m_dwDelay;
UINT m_nTimerID;
int m_nCurrentIconIndex;

//{{AFX_MSG(CTrayTimerWnd)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDestroy();
afx_msg void OnTimer(UINT nIDEvent);
//}}AFX_MSG
afx_msg LRESULT OnTaskbarCreated(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()

DECLARE_DYNAMIC(CTrayTimerWnd)
};


//the actual tray notification class wrapper
class CTrayNotifyIcon : public CObject
{
public:
//Constructors / Destructors
CTrayNotifyIcon();
~CTrayNotifyIcon();

//Create the tray icon
BOOL Create(CWnd* pNotifyWnd, UINT uID, LPCTSTR pszTooltipText, HICON hIcon, UINT nNotifyMessage);
BOOL Create(CWnd* pNotifyWnd, UINT uID, LPCTSTR pszTooltipText, HICON* phIcons, int nNumIcons, DWORD dwDelay, UINT nNotifyMessage);

//Change or retrieve the Tooltip text
BOOL SetTooltipText(LPCTSTR pszTooltipText);
BOOL SetTooltipText(UINT nID);
CString GetTooltipText() const;

//Change or retrieve the icon displayed
BOOL SetIcon(HICON hIcon);
BOOL SetIcon(LPCTSTR lpIconName);
BOOL SetIcon(UINT nIDResource);
BOOL SetIcon(HICON* phIcons, int nNumIcons, DWORD dwDelay);
BOOL SetStandardIcon(LPCTSTR lpIconName);
BOOL SetStandardIcon(UINT nIDResource);
HICON GetIcon() const;
BOOL UsingAnimatedIcon() const { return m_bAnimated; };

//Change or retrieve the window to send notification messages to
BOOL SetNotificationWnd(CWnd* pNotifyWnd);
CWnd* GetNotificationWnd() const;

//Modification of the tray icons
void HideIcon();
void ShowIcon();
void RemoveIcon();
void MoveToExtremeRight();

//Default handler for tray notification message
virtual LRESULT OnTrayNotification(WPARAM uID, LPARAM lEvent);

//Status information
BOOL IsShowing() const { return !IsHidden(); };
BOOL IsHidden() const { return m_bHidden; };

protected:
BOOL CreateTimerWindow(HICON* phIcons, int nNumIcons, DWORD dwDelay);
void DestroyTimerWindow();
BOOL CreateRessurectionWindow();
void DestroyResurrectionWindow();

NOTIFYICONDATA m_NotifyIconData;
BOOL m_bCreated;
BOOL m_bHidden;
CWnd* m_pNotificationWnd;
CTrayTimerWnd* m_pTimerWnd;
CTrayRessurectionWnd* m_pResurrectionWnd;
BOOL m_bAnimated;

DECLARE_DYNAMIC(CTrayNotifyIcon)

friend class CTrayTimerWnd;
};

#endif //_NTRAY_H__
实现文件:
///////////////////////////////// Includes //////////////////////////////////
#include "stdafx.h"
#include "resource.h"
#include "ntray.h"



///////////////////////////////// Macros /////////////////////////////////////

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


///////////////////////////////// Implementation //////////////////////////////

const UINT wm_TaskbarCreated = RegisterWindowMessage(_T("TaskbarCreated"));

IMPLEMENT_DYNAMIC(CTrayRessurectionWnd, CFrameWnd)

BEGIN_MESSAGE_MAP(CTrayRessurectionWnd, CFrameWnd)
//{{AFX_MSG_MAP(CTrayRessurectionWnd)
//}}AFX_MSG_MAP
ON_REGISTERED_MESSAGE(wm_TaskbarCreated, OnTaskbarCreated)
END_MESSAGE_MAP()

LRESULT CTrayRessurectionWnd::OnTaskbarCreated(WPARAM wParam, LPARAM lParam)
{
ASSERT(m_pTrayIcon);

//Refresh the tray icon if necessary
if (m_pTrayIcon->IsShowing())
{
m_pTrayIcon->HideIcon();
m_pTrayIcon->ShowIcon();
}

return 0L;
}

CTrayRessurectionWnd::CTrayRessurectionWnd(CTrayNotifyIcon* pTrayIcon)
{
//must have at valid tray notify instance
ASSERT(pTrayIcon);

//Store the values away
m_pTrayIcon = pTrayIcon;
}





IMPLEMENT_DYNAMIC(CTrayTimerWnd, CFrameWnd)

BEGIN_MESSAGE_MAP(CTrayTimerWnd, CFrameWnd)
//{{AFX_MSG_MAP(CTrayTimerWnd)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

CTrayTimerWnd::CTrayTimerWnd(CTrayNotifyIcon* pTrayIcon, HICON* phIcons, int nNumIcons, DWORD dwDelay)
{
m_nCurrentIconIndex = 0;

//must have a valid tray notify instance
ASSERT(pTrayIcon);

//must have at least 1 icon
ASSERT(nNumIcons);

//array of icon handles must be valid
ASSERT(phIcons);

//must be non zero timer interval
ASSERT(dwDelay);

//Store the values away
m_pTrayIcon = pTrayIcon;

m_phIcons = new HICON[nNumIcons];
CopyMemory(m_phIcons, phIcons, nNumIcons * sizeof(HICON));
m_nNumIcons = nNumIcons;
m_dwDelay = dwDelay;
}

CTrayTimerWnd::~CTrayTimerWnd()
{
if (m_phIcons)
{
delete [] m_phIcons;
m_phIcons = NULL;
}
}

int CTrayTimerWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;

//create the animation timer
m_nTimerID = SetTimer(1, m_dwDelay, NULL);

return 0;
}

void CTrayTimerWnd::OnDestroy()
{
//kill the animation timer
KillTimer(m_nTimerID);

CFrameWnd::OnDestroy();
}

void CTrayTimerWnd::OnTimer(UINT nIDEvent)
{
//increment the icon index
++m_nCurrentIconIndex;
m_nCurrentIconIndex = m_nCurrentIconIndex % m_nNumIcons;

//update the tray icon
m_pTrayIcon->m_NotifyIconData.uFlags = NIF_ICON;
m_pTrayIcon->m_NotifyIconData.hIcon = m_phIcons[m_nCurrentIconIndex];
Shell_NotifyIcon(NIM_MODIFY, &m_pTrayIcon->m_NotifyIconData);
}




IMPLEMENT_DYNAMIC(CTrayNotifyIcon, CObject)

CTrayNotifyIcon::CTrayNotifyIcon()
{
memset(&m_NotifyIconData, 0, sizeof(m_NotifyIconData));
m_bCreated = FALSE;
m_bHidden = FALSE;
m_pNotificationWnd = NULL;
m_pResurrectionWnd = NULL;
m_pTimerWnd = NULL;
m_bAnimated = FALSE;
}

CTrayNotifyIcon::~CTrayNotifyIcon()
{
DestroyTimerWindow();
DestroyResurrectionWindow();
RemoveIcon();
}

void CTrayNotifyIcon::HideIcon()
{
ASSERT(m_bCreated);
if (!m_bHidden)
{
m_NotifyIconData.uFlags = NIF_ICON;
Shell_NotifyIcon(NIM_DELETE, &m_NotifyIconData);
m_bHidden = TRUE;
}
}

void CTrayNotifyIcon::ShowIcon()
{
ASSERT(m_bCreated);
if (m_bHidden)
{
m_NotifyIconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
Shell_NotifyIcon(NIM_ADD, &m_NotifyIconData);
m_bHidden = FALSE;
}
}

void CTrayNotifyIcon::RemoveIcon()
{
if (m_bCreated)
{
m_NotifyIconData.uFlags = 0;
Shell_NotifyIcon(NIM_DELETE, &m_NotifyIconData);
m_bCreated = FALSE;
}
}

void CTrayNotifyIcon::MoveToExtremeRight()
{
HideIcon();
ShowIcon();
}

BOOL CTrayNotifyIcon::Create(CWnd* pNotifyWnd, UINT uID, LPCTSTR pszTooltipText, HICON hIcon, UINT nNotifyMessage)
{
//Create the ressurection window
if (!CreateRessurectionWindow())
return FALSE;

//Make sure Notification window is valid
ASSERT(pNotifyWnd && ::IsWindow(pNotifyWnd->GetSafeHwnd()));
m_pNotificationWnd = pNotifyWnd;

//Make sure we avoid conflict with other messages
ASSERT(nNotifyMessage >= WM_USER);

//Tray only supports tooltip text up to 64 characters
ASSERT(_tcslen(pszTooltipText) <= 64);

m_NotifyIconData.cbSize = sizeof(m_NotifyIconData);
m_NotifyIconData.hWnd = pNotifyWnd->GetSafeHwnd();
m_NotifyIconData.uID = uID;
m_NotifyIconData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
m_NotifyIconData.uCallbackMessage = nNotifyMessage;
m_NotifyIconData.hIcon = hIcon;
_tcscpy(m_NotifyIconData.szTip, pszTooltipText);

BOOL rVal = Shell_NotifyIcon(NIM_ADD, &m_NotifyIconData);
m_bCreated = rVal;

return rVal;
}

BOOL CTrayNotifyIcon::CreateRessurectionWindow()
{
//Create the resurrection window
ASSERT(m_pResurrectionWnd == NULL);
m_pResurrectionWnd = new CTrayRessurectionWnd(this);
if (!m_pResurrectionWnd)
return FALSE;
if (!m_pResurrectionWnd->Create(NULL, _T("CTrayNotifyIcon Resurrection Notification Window")))
return FALSE;

return TRUE;
}

void CTrayNotifyIcon::DestroyResurrectionWindow()
{
if (m_pResurrectionWnd)
{
m_pResurrectionWnd->SendMessage(WM_CLOSE);
m_pResurrectionWnd = NULL;
}
}

BOOL CTrayNotifyIcon::CreateTimerWindow(HICON* phIcons, int nNumIcons, DWORD dwDelay)
{
//create the hidden window which will contain the timer which will do the animation
ASSERT(m_pTimerWnd == NULL);
m_pTimerWnd = new CTrayTimerWnd(this, phIcons, nNumIcons, dwDelay);
if (!m_pTimerWnd)
return FALSE;
if (!m_pTimerWnd->Create(NULL, _T("CTrayNotifyIcon Animation Notification Window")))
return FALSE;

return TRUE;
}

void CTrayNotifyIcon::DestroyTimerWindow()
{
if (m_pTimerWnd)
{
m_pTimerWnd->SendMessage(WM_CLOSE);
m_pTimerWnd = NULL;
}
}

BOOL CTrayNotifyIcon::Create(CWnd* pNotifyWnd, UINT uID, LPCTSTR pszTooltipText, HICON* phIcons, int nNumIcons, DWORD dwDelay, UINT nNotifyMessage)
{
//must be using at least 2 icons
ASSERT(nNumIcons >= 2);

if (!CreateTimerWindow(phIcons, nNumIcons, dwDelay))
return FALSE;

//let the normal Create function do its stuff
BOOL bSuccess = Create(pNotifyWnd, uID, pszTooltipText, phIcons[0], nNotifyMessage);
m_bAnimated = TRUE;
return bSuccess;
}

BOOL CTrayNotifyIcon::SetTooltipText(LPCTSTR pszTooltipText)
{
if (!m_bCreated)
return FALSE;

m_NotifyIconData.uFlags = NIF_TIP;
_tcscpy(m_NotifyIconData.szTip, pszTooltipText);

return Shell_NotifyIcon(NIM_MODIFY, &m_NotifyIconData);
}

BOOL CTrayNotifyIcon::SetTooltipText(UINT nID)
{
CString sToolTipText;
VERIFY(sToolTipText.LoadString(nID));

return SetTooltipText(sToolTipText);
}

BOOL CTrayNotifyIcon::SetIcon(HICON hIcon)
{
if (!m_bCreated)
return FALSE;

DestroyTimerWindow();
m_bAnimated = FALSE;
m_NotifyIconData.uFlags = NIF_ICON;
m_NotifyIconData.hIcon = hIcon;

return Shell_NotifyIcon(NIM_MODIFY, &m_NotifyIconData);
}

BOOL CTrayNotifyIcon::SetIcon(LPCTSTR lpIconName)
{
HICON hIcon = AfxGetApp()->LoadIcon(lpIconName);

return SetIcon(hIcon);
}

BOOL CTrayNotifyIcon::SetIcon(UINT nIDResource)
{
HICON hIcon = AfxGetApp()->LoadIcon(nIDResource);

return SetIcon(hIcon);
}

BOOL CTrayNotifyIcon::SetStandardIcon(LPCTSTR lpIconName)
{
HICON hIcon = LoadIcon(NULL, lpIconName);

return SetIcon(hIcon);
}

BOOL CTrayNotifyIcon::SetStandardIcon(UINT nIDResource)
{
HICON hIcon = LoadIcon(NULL, MAKEINTRESOURCE(nIDResource));

return SetIcon(hIcon);
}

BOOL CTrayNotifyIcon::SetIcon(HICON* phIcons, int nNumIcons, DWORD dwDelay)
{
ASSERT(nNumIcons >= 2);
ASSERT(phIcons);

if (!SetIcon(phIcons[0]))
return FALSE;

DestroyTimerWindow();
if (!CreateTimerWindow(phIcons, nNumIcons, dwDelay))
return FALSE;
m_bAnimated = TRUE;

return TRUE;
}

BOOL CTrayNotifyIcon::SetNotificationWnd(CWnd* pNotifyWnd)
{
if (!m_bCreated)
return FALSE;

//Make sure Notification window is valid
ASSERT(pNotifyWnd && ::IsWindow(pNotifyWnd->GetSafeHwnd()));

m_pNotificationWnd = pNotifyWnd;
m_NotifyIconData.hWnd = pNotifyWnd->GetSafeHwnd();
m_NotifyIconData.uFlags = 0;

return Shell_NotifyIcon(NIM_MODIFY, &m_NotifyIconData);
}

CString CTrayNotifyIcon::GetTooltipText() const
{
CString sText;
if (m_bCreated)
sText = m_NotifyIconData.szTip;

return sText;
}

HICON CTrayNotifyIcon::GetIcon() const
{
HICON hIcon = NULL;
if (m_bCreated)
{
if (m_bAnimated)
hIcon = m_pTimerWnd->GetCurrentIcon();
else
hIcon = m_NotifyIconData.hIcon;
}

return hIcon;
}

CWnd* CTrayNotifyIcon::GetNotificationWnd() const
{
return m_pNotificationWnd;
}

LRESULT CTrayNotifyIcon::OnTrayNotification(WPARAM wID, LPARAM lEvent)
{
//Return quickly if its not for this tray icon
if (wID != m_NotifyIconData.uID)
return 0L;

//As a default action use a menu resource with the same id
//as this was created with
CMenu menu;
if (!menu.LoadMenu(m_NotifyIconData.uID))
return 0;

CMenu* pSubMenu = menu.GetSubMenu(0);
if (!pSubMenu)
return 0;

if (lEvent == WM_RBUTTONUP)
{
//Clicking with right button brings up a context menu

// Make first menu item the default (bold font)
::SetMenuDefaultItem(pSubMenu->m_hMenu, 0, TRUE);

//Display and track the popup menu
CPoint pos;
GetCursorPos(&pos);
::SetForegroundWindow(m_NotifyIconData.hWnd);
::TrackPopupMenu(pSubMenu->m_hMenu, 0, pos.x, pos.y, 0, m_NotifyIconData.hWnd, NULL);

}
else if (lEvent == WM_LBUTTONDBLCLK)
{
// double click received, the default action is to execute first menu item
::SendMessage(m_NotifyIconData.hWnd, WM_COMMAND, pSubMenu->GetMenuItemID(0), 0);
}

return 1; // handled
}



rememberME 2001-02-13
  • 打赏
  • 举报
回复
Shell_NotifyIcon函数
yes_start 2001-02-13
  • 打赏
  • 举报
回复
现成的范例好多啊

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧