我在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, &notifydata))
AfxMessageBox("good"); //加载成功

解决方案 »

  1.   

    #define WM_NOTIFY_MESSAGE WM_USER+1m_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, &notifydata))
    AfxMessageBox("good");增加了回调函数,问题依然存在!
      

  2.   

    如果用了MFC,用ON_MESSAGE添加消息处理函数,定义一个自定义消息由图标发出。在你的消息处理函数中处理。
      

  3.   

    我增加了添加消息处理函数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);
    }
    但还是不好用!
      

  4.   

    我贴个类给你吧,你要不想用类,自己再改改。//CTrayIcon.h#define WM_ICON_MESSAGE WM_USER + 1class 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;
    }
      

  5.   

    /////////////////////////////////////////////////////////////////////////////
    // CMainFrameIMPLEMENT_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/destructionCMainFrame::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;
    }
    }以上没贴全,参考着试试吧
      

  6.   

    谢谢楼上的各位!我不明白自定义的消息WM_ICON_MESSAGE在什么时候被发送。
    即触发什么事件会发送消息WM_ICON_MESSAGE
    因为我在程序中没有发现有显式发送消息的代码,如
    send(NULL,WM_ICON_MESSAGE,,)
      

  7.   

    努力一下!
    是不是只要双击或者单击图标,就会发送WM_ICON_MESSAGE 
    Process system tray icon message
      

  8.   

    努力一下!
    是不是只要双击或者单击图标,就会发送WM_ICON_MESSAGE 
    Process system tray icon message