我在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"); //加载成功
图表加载成功,但是只要鼠标一放到图标上面,图表就消失了!
应该怎么处理,是不是设置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"); //加载成功
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");增加了回调函数,问题依然存在!
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);
}
但还是不好用!
{
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;
}
// 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;
}
}以上没贴全,参考着试试吧
即触发什么事件会发送消息WM_ICON_MESSAGE
因为我在程序中没有发现有显式发送消息的代码,如
send(NULL,WM_ICON_MESSAGE,,)
是不是只要双击或者单击图标,就会发送WM_ICON_MESSAGE
Process system tray icon message
是不是只要双击或者单击图标,就会发送WM_ICON_MESSAGE
Process system tray icon message