// // utbtray.h // #ifndef UTBTRAY_H #define UTBTRAY_H #include "ptrary.h" #include "cuibln.h" #include "slbarid.h" #include "nuiinat.h" class CTrayIconWnd; class CTipbarItem; #define WM_TIW_MAINICON (WM_USER + 0x0000) #define WM_TIW_MAINICON_DELAY (WM_USER + 0x0001) #define WM_TIW_WIN32IMEICON (WM_USER + 0x0002) #define WM_TIW_WIN32IMEICON_DELAY (WM_USER + 0x0003) #define WM_TIW_START (WM_USER + 0x1000) #define TIW_INDICATOR_ID_MAIN 0x0000 #define TIW_INDICATOR_ID_WIN32IME 0x0001 #define TIW_INDICATOR_ID_START 0x1000 #define TIW_RAI_LEAVELANGICON 0x0001 #define TIW_RAI_LEAVEKEYBOARDICON 0x0002 extern const GUID GUID_LBI_TRAYMAIN; ////////////////////////////////////////////////////////////////////////////// // // CTrayIconItem // ////////////////////////////////////////////////////////////////////////////// class CTrayIconItem { public: CTrayIconItem(CTrayIconWnd *ptiwnd); virtual ~CTrayIconItem(); BOOL _Init(HWND hwnd, UINT uCallbackMessage, UINT uID, REFGUID rguid); virtual BOOL SetIcon(HICON hIcon, const WCHAR *pszTooltip); BOOL RemoveIcon(); virtual BOOL OnMsg(WPARAM wParam, LPARAM lParam) {return FALSE;} virtual BOOL OnDelayMsg(UINT uMsg) {return FALSE;} UINT GetMsg() {return _uCallbackMessage;} BOOL UpdateMenuRectPoint(); const GUID *GetGuid() {return &_guidBtnItem;} UINT GetID() {return _uID;} BOOL IsShownInTray() {return _fShownInTray;} protected: HWND _hwnd; UINT _uCallbackMessage; UINT _uID; BOOL _fIconPrev; BOOL _fShownInTray; CTrayIconWnd *_ptiwnd; DWORD _dwThreadFocus; GUID _guidBtnItem; RECT _rcClick; POINT _ptClick; }; ////////////////////////////////////////////////////////////////////////////// // // CButtonIconItem // ////////////////////////////////////////////////////////////////////////////// class CButtonIconItem : public CTrayIconItem { public: CButtonIconItem(CTrayIconWnd *ptiwnd, BOOL fMenuButtonItem); ~CButtonIconItem(); virtual BOOL OnMsg(WPARAM wParam, LPARAM lParam); virtual BOOL OnDelayMsg(UINT uMsg); protected: BOOL _fMenuButtonItem; }; ////////////////////////////////////////////////////////////////////////////// // // CMainIconItem // ////////////////////////////////////////////////////////////////////////////// class CMainIconItem : public CButtonIconItem { public: CMainIconItem(CTrayIconWnd *ptiwnd) : CButtonIconItem(ptiwnd, TRUE) {} ~CMainIconItem() {} BOOL Init(HWND hwnd) { return _Init(hwnd, WM_TIW_MAINICON, TIW_INDICATOR_ID_MAIN, GUID_LBI_TRAYMAIN); } virtual BOOL OnDelayMsg(UINT uMsg); HKL _hkl; }; ////////////////////////////////////////////////////////////////////////////// // // CTrayIconWnd // ////////////////////////////////////////////////////////////////////////////// class CTrayIconWnd { public: CTrayIconWnd(); ~CTrayIconWnd(); HWND CreateWnd(); HWND GetWnd() {return _hWnd;} void DestroyWnd() { DestroyWindow(_hWnd); _hWnd = NULL; } static BOOL RegisterClass(); BOOL SetMainIcon(HKL hkl); HWND GetNotifyWnd() { if (!IsWindow(_hwndNotify)) FindTrayEtc(); return _hwndNotify; } BOOL SetIcon(REFGUID rguid, BOOL fMenu, HICON hIcon, const WCHAR *pszToolTip); void RemoveAllIcon(DWORD dwFlags) { int i; for (i = 0;i < _rgIconItems.Count(); i++) { CTrayIconItem *pItem = _rgIconItems.Get(i); if (dwFlags & TIW_RAI_LEAVELANGICON) { if (IsEqualGUID(*pItem->GetGuid(), GUID_LBI_INATITEM) || IsEqualGUID(*pItem->GetGuid(), GUID_LBI_CTRL)) continue; } if (dwFlags & TIW_RAI_LEAVEKEYBOARDICON) { if (IsEqualGUID(*pItem->GetGuid(), GUID_TFCAT_TIP_KEYBOARD)) continue; } if (pItem->GetID() >= TIW_INDICATOR_ID_START) pItem->RemoveIcon(); } return; } BOOL IsShownInTray(REFGUID rguid) { CTrayIconItem *pItem = FindIconItem(rguid); return pItem ? pItem->IsShownInTray() : FALSE; } void RemoveUnusedIcons(CPtrArray *prgItem); BOOL _fShowExtraIcons; BOOL _fInTrayMenu; UINT _uCurCallbackMessage; UINT _uCurMouseMessage; void CallOnDelayMsg(); DWORD GetThreadIdTray() {return _dwThreadIdTray;} DWORD GetThreadIdProgman() {return _dwThreadIdProgman;} private: static LRESULT CALLBACK _WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); HWND _hWnd; static const char _szWndClass[]; static void SetThis(HWND hWnd, LPARAM lParam) { if (lParam) SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)((CREATESTRUCT *)lParam)->lpCreateParams); else SetWindowLongPtr(hWnd, GWLP_USERDATA, 0); } static CTrayIconWnd *GetThis(HWND hWnd) { return (CTrayIconWnd *)GetWindowLongPtr(hWnd, GWLP_USERDATA); } static BOOL CALLBACK EnumChildWndProc(HWND hwnd, LPARAM lParam); BOOL FindTrayEtc(); HKL _hklCurrent; HICON _hiconWin32Current; HWND _hwndTray; HWND _hwndNotify; DWORD _dwThreadIdTray; DWORD _dwThreadIdForIcon; HWND _hwndProgman; DWORD _dwThreadIdProgman; BOOL OnIconMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); CMainIconItem *_ptiiMain; CPtrArray _rgIconItems; CTrayIconItem *FindIconItem(REFGUID rguid) { int i; for (i = 0;i < _rgIconItems.Count(); i++) { CTrayIconItem *pItem = _rgIconItems.Get(i); if (IsEqualGUID(rguid, *pItem->GetGuid())) return pItem; } return NULL; } UINT _uNextMsg; UINT _uNextID; }; #endif //UTBTRAY_H