#ifndef _ZEROT_TRAYICON_H
#define _ZEROT_TRAYICON_H

////////////////
#define MYWM_SHOWMINBOX WM_USER + 2  // 自定义消息,显示迷你对话框;


class ITrayIcon : public CCmdTarget 
{
protected:
	DECLARE_DYNAMIC(ITrayIcon)
	NOTIFYICONDATA m_nid;			// struct for Shell_NotifyIcon args

public:
	ITrayIcon(UINT uID);
	~ITrayIcon();

	// Call this to receive tray notifications
	void SetNotificationWnd(CWnd* pNotifyWnd, UINT uCbMsg);

	// SetIcon functions. To remove icon, call SetIcon(0)
	BOOL SetIcon(UINT uID); // only set the icon,but without tip zt.
	BOOL SetIcon(HICON hicon, LPCTSTR lpTip);
	BOOL SetIcon(UINT uID, LPCTSTR lpTip);
	BOOL SetIcon(LPCTSTR lpResName, LPCTSTR lpTip)
	{ 
		return SetIcon(lpResName ? 	AfxGetApp()->LoadIcon(lpResName) : NULL, lpTip); 
	}

	// 设置提示(设置提示时,是否也要同时设置图标???);
	BOOL SetTip(LPCTSTR lpTip);
	BOOL SetTipTitle(LPCTSTR lpTipTitle);
	//BOOL SetInfo(LPCSTR lpInfo,LPCSTR lpInfoTitle = _T(""));	// NIF_INFO
	BOOL SetInfo(LPCTSTR lpInfo, LPCTSTR lpInfoTitle = NULL);	// NIF_INFO

	BOOL SetStandardIcon(LPCTSTR lpszIconName, LPCTSTR lpTip)
	{ 
		return SetIcon(::LoadIcon(NULL, lpszIconName), lpTip); 
	}

	virtual LRESULT OnTrayNotification(WPARAM uID, LPARAM lEvent);

	// -------------------------------以下是托盘闪烁实现------------------------------- [5/30/2013 Z.t]
public:
	bool IsFlashing(){return bSuspending;}						// 外部调用,判断是否在闪烁;
	void SetMiniShow(BOOL bSet){bShowMinibox = bSet;}

	BOOL StartFlashing();
	BOOL StopFlashing();
	inline void SetIconInfos(const UINT &u1,const UINT &u2,const UINT &u3);
	inline void SetDefaultTip(LPCTSTR lpTip){_lpTip=lpTip;}
protected:
	bool bSuspending;			// 线程运行标识;
	
	LPCTSTR _lpTip;				// 默认的提示;
	UINT _utIcon[3];			// 1.停止闪烁时的默认图标;2.闪烁时的报警图标;3.闪烁时的盘里背景图标;

	DWORD  m_dwThreadID;		// 线程ID; 
	HANDLE m_hThreadCtrl;		// 线程控件事件;
	HANDLE m_hThreadObj;		// 线程本身;

	BOOL bShowMinibox;			// 闪烁期间,是否对窗口发送消息;
	void GetTrayRect(RECT &rc);
	BOOL IsWow64();

	// 托盘闪烁线程;
	int OpendThread();
	void TerminalThread();
	static DWORD WINAPI FlashingThread(LPVOID pVoid);

};

inline void ITrayIcon::SetIconInfos(const UINT &u1,const UINT &u2,const UINT &u3)
{
	_utIcon[0] = u1;
	_utIcon[1] = u2;
	_utIcon[2] = u3;
}

#endif

// 未处理的BUG:
// 1.在任务管理器中结束进程,托盘图标未能清除;
// SetIcon(0)代表着清除托盘图标(NIF_DELETE);
