• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

Shell_NotifyIcon出现的问题

yuanye2008 2004-11-25 01:57:26
我在MainFrm.cpp 的OnCreate中,增加下列代码,目的是在状态栏加载图表。
图表加载成功,但是只要鼠标一放到图标上面,图表就消失了!
应该怎么处理,是不是设置notifydata.szTip的时候出现了错误!?
m_hIcon1 = AfxGetApp()->LoadIcon(IDI_ICON1);

NOTIFYICONDATA notifydata;
notifydata.cbSize = sizeof(NOTIFYICONDATA);
notifydata.hIcon = m_hIcon1;
notifydata.hWnd = AfxGetMainWnd()->GetSafeHwnd();
strcpy(notifydata.szTip,_T("GOOD TIPS"));
notifydata.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
notifydata.uID = IDI_ICON1;

if (::Shell_NotifyIcon(NIM_ADD, ¬ifydata))
AfxMessageBox("good"); //加载成功
...全文
201 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yuanye2008 2004-12-10
谢谢楼上的各位!

我不明白自定义的消息WM_ICON_MESSAGE在什么时候被发送。
即触发什么事件会发送消息WM_ICON_MESSAGE
因为我在程序中没有发现有显式发送消息的代码,如
send(NULL,WM_ICON_MESSAGE,,)
回复
yuanye2008 2004-12-10
努力一下!
是不是只要双击或者单击图标,就会发送WM_ICON_MESSAGE
Process system tray icon message
回复
yuanye2008 2004-12-10
努力一下!
是不是只要双击或者单击图标,就会发送WM_ICON_MESSAGE
Process system tray icon message
回复
大雾 2004-11-29
/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
...
ON_MESSAGE(WM_ICON_MESSAGE, OnIcon)
...
//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
m_pTrayIcon = new CTrayIcon(IDR_MAINFRAME);
}

CMainFrame::~CMainFrame()
{
delete m_pTrayIcon;
}

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

return InitTrayIcon();
}

BOOL CMainFrame::InitTrayIcon()
{
//Setting system tray icon message handler window

m_pTrayIcon->SetNotificationWnd(this, WM_ICON_MESSAGE);

//Install system tray icon, and set the tool tip information

if(!m_pTrayIcon->SetIcon(m_hIcon, TOOLTIP))
return FALSE;

return TRUE;
}

/*************************************************************************************
* Date : 2004-5-21 14:30:17
* Author : LCG
* Params : wID -- icon ID
* lEvent -- message ID
* Comments : Process system tray icon message
*************************************************************************************/

void CMainFrame::OnIcon(WPARAM wID, LPARAM lEvent)
{
switch(lEvent)
{
case WM_LBUTTONDBLCLK:
{
OnTraySetting();
break;
}
case WM_RBUTTONUP:
{
CMenu* pMenu = m_menu.GetSubMenu(0);

if(pMenu)
{
CPoint pt;

::GetCursorPos(&pt);

SetForegroundWindow();

pMenu->SetDefaultItem(0, TRUE);

pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this);

PostMessage(WM_NULL, 0, 0);
}
else
{
SendMessage(WM_COMMAND, ID_TRAY_EXIT, 0);
}

break;
}
default:break;
}
}

以上没贴全,参考着试试吧
回复
大雾 2004-11-29
我贴个类给你吧,你要不想用类,自己再改改。

//CTrayIcon.h

#define WM_ICON_MESSAGE WM_USER + 1

class CTrayIcon : public CCmdTarget
{
DECLARE_DYNAMIC(CTrayIcon)

public:
CTrayIcon(UINT uID);
virtual ~CTrayIcon();

BOOL SetIcon(UINT uID);

BOOL SetIcon(HICON hicon, LPCTSTR lpTip);

BOOL SetIcon(LPCTSTR lpResName, LPCTSTR lpTip){
return SetIcon(lpResName ? AfxGetApp()->LoadIcon(lpResName) : NULL, lpTip);
};

void SetNotificationWnd(CWnd* pNotifyWnd, UINT uCbMsg);

protected:
NOTIFYICONDATA m_nid;
};


//CTrayIcon.cpp

#include "TrayIcon.h"

IMPLEMENT_DYNAMIC(CTrayIcon, CCmdTarget)

CTrayIcon::CTrayIcon(UINT uID)
{
memset(&m_nid, 0 , sizeof(m_nid));
m_nid.cbSize = sizeof(m_nid);
m_nid.uID = uID;
}

CTrayIcon::~CTrayIcon()
{
SetIcon(0);
}

BOOL CTrayIcon::SetIcon(UINT uID)
{
HICON hicon = NULL;
if(uID)
{
hicon = AfxGetApp()->LoadIcon(uID);
}
return SetIcon(hicon, NULL);
}

BOOL CTrayIcon::SetIcon(HICON hicon, LPCTSTR lpTip)
{
UINT msg;
m_nid.uFlags = 0;
if(hicon)
{
msg = m_nid.hIcon ? NIM_MODIFY : NIM_ADD;
m_nid.hIcon = hicon;
m_nid.uFlags |= NIF_ICON;
}
else
{
if (m_nid.hIcon == NULL)
return TRUE;

msg = NIM_DELETE;
}

if(lpTip)
_tcscpy(m_nid.szTip, lpTip);

if (m_nid.szTip[0])
m_nid.uFlags |= NIF_TIP;

if (m_nid.uCallbackMessage && m_nid.hWnd)
m_nid.uFlags |= NIF_MESSAGE;

BOOL bRet = Shell_NotifyIcon(msg, &m_nid);

if (msg == NIM_DELETE || !bRet)
m_nid.hIcon = NULL;

return bRet;
}

void CTrayIcon::SetNotificationWnd(CWnd* pNotifyWnd, UINT uCbMsg)
{
m_nid.hWnd = pNotifyWnd->GetSafeHwnd();
m_nid.uCallbackMessage = uCbMsg;
}

回复
yuanye2008 2004-11-26
帮帮忙!
回复
yuanye2008 2004-11-26
我增加了添加消息处理函数

ON_MESSAGE(WM_NOTIFY_MESSAGE,OnNotifyMessage)
afx_msg LRESULT OnNotifyMessage(WPARAM,LPARAM);

LRESULT CMainFrame::OnNotifyMessage(WPARAM,LPARAM)
{
AfxMessageBox("nihao");
return 1;
}
//重写WindowProc
LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_NOTIFY_MESSAGE)
AfxMessageBox("good");

return CFrameWnd::WindowProc(message, wParam, lParam);
}
但还是不好用!
回复
yuanye2008 2004-11-25
谢谢,让我试试看!
回复
大雾 2004-11-25
如果用了MFC,用ON_MESSAGE添加消息处理函数,定义一个自定义消息由图标发出。在你的消息处理函数中处理。
回复
xuzheng318 2004-11-25
帮你一把
回复
yuanye2008 2004-11-25
努力!
回复
yuanye2008 2004-11-25
努力一下!
回复
yuanye2008 2004-11-25
#define WM_NOTIFY_MESSAGE WM_USER+1

m_hIcon1 = AfxGetApp()->LoadIcon(IDI_ICON1);

NOTIFYICONDATA notifydata;
notifydata.cbSize = sizeof(NOTIFYICONDATA);
notifydata.hIcon = m_hIcon1;
notifydata.uCallbackMessage = WM_NOTIFY_MESSAGE
notifydata.hWnd = AfxGetMainWnd()->GetSafeHwnd();
strcpy(notifydata.szTip,_T("GOOD TIPS"));
notifydata.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
notifydata.uID = IDI_ICON1;

if (::Shell_NotifyIcon(NIM_ADD, ¬ifydata))
AfxMessageBox("good");

增加了回调函数,问题依然存在!
回复
大雾 2004-11-25
还要设置回调函数等东西,再仔细看看帮助。
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-11-25 01:57
社区公告

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