如何让程序最小化后成一个小图标?

jun 2000-06-20 01:14:00
请教!!
...全文
262 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
土豆 2000-06-23
  • 打赏
  • 举报
回复
要显示道桌面右下角的地方吗?用下面的代码:

#define MYWM_NOTIFYICON(WM_APP+100)

void ShowTrayIcon()
{
NOTIFYICONDATA ncd;

char * szToolTip="TrayIcon Demo";
UINT uID=1;//自己定义的标识值,随便什么值

ncd.cbSize = sizeof(NOTIFYICONDATA);
ncd.hWnd =hwnd; //窗口的句柄
ncd.uID = ID; //
ncd.hIcon = icon; //图标的句柄
ncd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
ncd.uCallbackMessage = MYWM_NOTIFYICON; //你可以在窗口消息中处理这个消息
_tcscpy(ncd.szTip, szToolTip);

Shell_NotifyIcon(NIM_ADD, &ncd);
}
DragonCheng 2000-06-23
  • 打赏
  • 举报
回复
可以参考CSDN的例程
jun 2000-06-23
  • 打赏
  • 举报
回复
To :FireAngel
请问我要让程序最小化时只显示一个图标应该调用哪个函数啊,我用了HideIcon()
和SetNotificationWnd(GetParent())都无效,请再指教!
risings 2000-06-22
  • 打赏
  • 举报
回复
csdn更新以前有个系统托盘控件SysTary,很好用,可换图标、闪烁、返回左右见单双击事件。如果你要的话,我可以寄一份给你。不过最好还是用API来做,象LJN所说的那样。
土豆 2000-06-21
  • 打赏
  • 举报
回复
给你一个实现的类,你只要生成该类的对象,调用对象的有关方法就可以实现。

/////////////////////////////////////////////////////////////////////////////
//SystemTray.h
#ifndef _INCLUDED_SYSTEMTRAY_H_
#define _INCLUDED_SYSTEMTRAY_H_

#include <afxtempl.h>
#include <afxdisp.h> // COleDateTime

/////////////////////////////////////////////////////////////////////////////
// CSystemTray window

class CSystemTray : public CWnd
{
// Construction/destruction
public:
CSystemTray();
CSystemTray(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szTip, HICON icon, UINT uID);
virtual ~CSystemTray();

DECLARE_DYNAMIC(CSystemTray)

// Operations
public:
BOOL Enabled() { return m_bEnabled; }
BOOL Visible() { return !m_bHidden; }

// Create the tray icon
Create(CWnd* pParent, UINT uCallbackMessage, LPCTSTR szTip, HICON icon, UINT uID);

// 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 lpszIconName);
BOOL SetIcon(UINT nIDResource);
BOOL SetStandardIcon(LPCTSTR lpIconName);
BOOL SetStandardIcon(UINT nIDResource);
HICON GetIcon() const;
void HideIcon();
void ShowIcon();
void RemoveIcon();
void MoveToRight();

// For icon animation
BOOL SetIconList(UINT uFirstIconID, UINT uLastIconID);
BOOL SetIconList(HICON* pHIconList, UINT nNumIcons);
BOOL Animate(UINT nDelayMilliSeconds, int nNumSeconds = -1);
BOOL StepAnimation();
BOOL StopAnimation();

// Change menu default item
void GetMenuDefaultItem(UINT& uItem, BOOL& bByPos);
BOOL SetMenuDefaultItem(UINT uItem, BOOL bByPos);

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

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

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSystemTray)
protected:
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
//}}AFX_VIRTUAL

// Implementation
protected:
void Initialise();

BOOL m_bEnabled; // does O/S support tray icon?
BOOL m_bHidden; // Has the icon been hidden?
NOTIFYICONDATA m_tnd;

CArray<HICON, HICON> m_IconList;
static UINT m_nIDEvent;
UINT m_uIDTimer;
int m_nCurrentIcon;
COleDateTime m_StartTime;
int m_nAnimationPeriod;
HICON m_hSavedIcon;
UINT m_DefaultMenuItemID;
BOOL m_DefaultMenuItemByPos;

// Generated message map functions
protected:
//{{AFX_MSG(CSystemTray)
afx_msg void OnTimer(UINT nIDEvent);
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};


#endif

/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
// SystemTray.cpp : implementation file

#include "stdafx.h"
#include "SystemTray.h"

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

IMPLEMENT_DYNAMIC(CSystemTray, CWnd)

UINT CSystemTray::m_nIDEvent = 4567;

/////////////////////////////////////////////////////////////////////////////
// CSystemTray construction/creation/destruction

CSystemTray::CSystemTray()
{
Initialise();
}

CSystemTray::CSystemTray(CWnd* pParent, UINT uCallbackMessage, LPCTSTR szToolTip,
HICON icon, UINT uID)
{
Initialise();
Create(pParent, uCallbackMessage, szToolTip, icon, uID);
}

void CSystemTray::Initialise()
{
memset(&m_tnd, 0, sizeof(m_tnd));
m_bEnabled = FALSE;
m_bHidden = FALSE;
m_uIDTimer = 0;
m_hSavedIcon = NULL;
m_DefaultMenuItemID = 0;
m_DefaultMenuItemByPos = TRUE;
}

BOOL CSystemTray::Create(CWnd* pParent, UINT uCallbackMessage, LPCTSTR szToolTip,
HICON icon, UINT uID)
{
// this is only for Windows 95 (or higher)
m_bEnabled = (GetVersion() & 0xff) >= 4;
if (!m_bEnabled)
{
ASSERT(FALSE);
return FALSE;
}

// Make sure Notification window is valid (not needed - CJM)
// VERIFY(m_bEnabled = (pParent && ::IsWindow(pParent->GetSafeHwnd())));
// if (!m_bEnabled) return FALSE;

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

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

// Create an invisible window
CWnd::CreateEx(0, AfxRegisterWndClass(0), _T(""), WS_POPUP, 0,0,10,10, NULL, 0);

// load up the NOTIFYICONDATA structure
m_tnd.cbSize = sizeof(NOTIFYICONDATA);
m_tnd.hWnd = pParent->GetSafeHwnd()? pParent->GetSafeHwnd() : m_hWnd;
m_tnd.uID = uID;
m_tnd.hIcon = icon;
m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
m_tnd.uCallbackMessage = uCallbackMessage;
_tcscpy(m_tnd.szTip, szToolTip);

// Set the tray icon
m_bEnabled = Shell_NotifyIcon(NIM_ADD, &m_tnd);
ASSERT(m_bEnabled);
return m_bEnabled;
}

CSystemTray::~CSystemTray()
{
RemoveIcon();
m_IconList.RemoveAll();
DestroyWindow();
}

/////////////////////////////////////////////////////////////////////////////
// CSystemTray icon manipulation

void CSystemTray::MoveToRight()
{
HideIcon();
ShowIcon();
}

void CSystemTray::RemoveIcon()
{
if (!m_bEnabled) return;

m_tnd.uFlags = 0;
Shell_NotifyIcon(NIM_DELETE, &m_tnd);
m_bEnabled = FALSE;
}

void CSystemTray::HideIcon()
{
if (m_bEnabled && !m_bHidden) {
m_tnd.uFlags = NIF_ICON;
Shell_NotifyIcon (NIM_DELETE, &m_tnd);
m_bHidden = TRUE;
}
}

void CSystemTray::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 CSystemTray::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 CSystemTray::SetIcon(LPCTSTR lpszIconName)
{
HICON hIcon = AfxGetApp()->LoadIcon(lpszIconName);

return SetIcon(hIcon);
}

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

return SetIcon(hIcon);
}

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

return SetIcon(hIcon);
}

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

return SetIcon(hIcon);
}

HICON CSystemTray::GetIcon() const
{
return (m_bEnabled)? m_tnd.hIcon : NULL;
}

BOOL CSystemTray::SetIconList(UINT uFirstIconID, UINT uLastIconID)
{
if (uFirstIconID > uLastIconID)
return FALSE;

UINT uIconArraySize = uLastIconID - uFirstIconID + 1;
const CWinApp * pApp = AfxGetApp();
ASSERT(pApp != 0);

m_IconList.RemoveAll();
try {
for (UINT i = uFirstIconID; i <= uLastIconID; i++)
m_IconList.Add(pApp->LoadIcon(i));
}
catch (CMemoryException *e)
{
e->ReportError();
e->Delete();
m_IconList.RemoveAll();
return FALSE;
}

return TRUE;
}

BOOL CSystemTray::SetIconList(HICON* pHIconList, UINT nNumIcons)
{
m_IconList.RemoveAll();

try {
for (UINT i = 0; i <= nNumIcons; i++)
m_IconList.Add(pHIconList[i]);
}
catch (CMemoryException *e)
{
e->ReportError();
e->Delete();
m_IconList.RemoveAll();
return FALSE;
}

return TRUE;
}

BOOL CSystemTray::Animate(UINT nDelayMilliSeconds, int nNumSeconds /*=-1*/)
{
StopAnimation();

m_nCurrentIcon = 0;
m_StartTime = COleDateTime::GetCurrentTime();
m_nAnimationPeriod = nNumSeconds;
m_hSavedIcon = GetIcon();

// Setup a timer for the animation
m_uIDTimer = SetTimer(m_nIDEvent, nDelayMilliSeconds, NULL);

return (m_uIDTimer != 0);
}

BOOL CSystemTray::StepAnimation()
{
if (!m_IconList.GetSize())
return FALSE;

m_nCurrentIcon++;
if (m_nCurrentIcon >= m_IconList.GetSize())
m_nCurrentIcon = 0;

return SetIcon(m_IconList[m_nCurrentIcon]);
}

BOOL CSystemTray::StopAnimation()
{
BOOL bResult = FALSE;

if (m_uIDTimer)
bResult = KillTimer(m_uIDTimer);
m_uIDTimer = 0;

if (m_hSavedIcon)
SetIcon(m_hSavedIcon);
m_hSavedIcon = NULL;

return bResult;
}

/////////////////////////////////////////////////////////////////////////////
// CSystemTray tooltip text manipulation

BOOL CSystemTray::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 CSystemTray::SetTooltipText(UINT nID)
{
CString strText;
VERIFY(strText.LoadString(nID));

return SetTooltipText(strText);
}

CString CSystemTray::GetTooltipText() const
{
CString strText;
if (m_bEnabled)
strText = m_tnd.szTip;

return strText;
}

/////////////////////////////////////////////////////////////////////////////
// CSystemTray notification window stuff

BOOL CSystemTray::SetNotificationWnd(CWnd* pWnd)
{
if (!m_bEnabled) return FALSE;

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

m_tnd.hWnd = pWnd->GetSafeHwnd();
m_tnd.uFlags = 0;

return Shell_NotifyIcon(NIM_MODIFY, &m_tnd);
}

CWnd* CSystemTray::GetNotificationWnd() const
{
return CWnd::FromHandle(m_tnd.hWnd);
}

/////////////////////////////////////////////////////////////////////////////
// CSystemTray menu manipulation

BOOL CSystemTray::SetMenuDefaultItem(UINT uItem, BOOL bByPos)
{
if ((m_DefaultMenuItemID == uItem) && (m_DefaultMenuItemByPos == bByPos))
return TRUE;

m_DefaultMenuItemID = uItem;
m_DefaultMenuItemByPos = bByPos;

CMenu menu, *pSubMenu;

if (!menu.LoadMenu(m_tnd.uID))
return FALSE;

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

::SetMenuDefaultItem(pSubMenu->m_hMenu, m_DefaultMenuItemID, m_DefaultMenuItemByPos);

return TRUE;
}

void CSystemTray::GetMenuDefaultItem(UINT& uItem, BOOL& bByPos)
{
uItem = m_DefaultMenuItemID;
bByPos = m_DefaultMenuItemByPos;
}

/////////////////////////////////////////////////////////////////////////////
// CSystemTray message handlers

BEGIN_MESSAGE_MAP(CSystemTray, CWnd)
//{{AFX_MSG_MAP(CSystemTray)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CSystemTray::OnTimer(UINT nIDEvent)
{
ASSERT(nIDEvent == m_nIDEvent);
UNUSED(nIDEvent);

COleDateTime CurrentTime = COleDateTime::GetCurrentTime();
COleDateTimeSpan period = CurrentTime - m_StartTime;
if (m_nAnimationPeriod > 0 && m_nAnimationPeriod < period.GetTotalSeconds())
{
StopAnimation();
return;
}

StepAnimation();
}

LRESULT CSystemTray::OnTrayNotification(UINT wParam, LONG lParam)
{
//Return quickly if its not for this tray icon
if (wParam != m_tnd.uID)
return 0L;

CMenu menu, *pSubMenu;
CWnd* pTarget = AfxGetMainWnd();

// Clicking with right button brings up a context menu
if (LOWORD(lParam) == WM_RBUTTONUP)
{
if (!menu.LoadMenu(m_tnd.uID))
return 0;

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

// Make chosen menu item the default (bold font)
::SetMenuDefaultItem(pSubMenu->m_hMenu, m_DefaultMenuItemID, m_DefaultMenuItemByPos);

// Display and track the popup menu
CPoint pos;
GetCursorPos(&pos);

pTarget->SetForegroundWindow();
::TrackPopupMenu(pSubMenu->m_hMenu, 0, pos.x, pos.y, 0,
pTarget->GetSafeHwnd(), NULL);

// BUGFIX: See "PRB: Menus for Notification Icons Don't Work Correctly"
pTarget->PostMessage(WM_NULL, 0, 0);

menu.DestroyMenu();
}
else if (LOWORD(lParam) == WM_LBUTTONDBLCLK)
{
// double click received, the default action is to execute default menu item
pTarget->SetForegroundWindow();

UINT uItem;
if (m_DefaultMenuItemByPos)
{
if (!menu.LoadMenu(m_tnd.uID))
return 0;

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

uItem = pSubMenu->GetMenuItemID(m_DefaultMenuItemID);
}
else
uItem = m_DefaultMenuItemID;

pTarget->SendMessage(WM_COMMAND, uItem, 0);

menu.DestroyMenu();
}

return 1;
}

LRESULT CSystemTray::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == m_tnd.uCallbackMessage)
return OnTrayNotification(wParam, lParam);

return CWnd::WindowProc(message, wParam, lParam);
}
LJN 2000-06-20
  • 打赏
  • 举报
回复
填充一个NOTIFYICONDATA对象,
再用Shell_NotifyIcon函数即可.

16,467

社区成员

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

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

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