Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

247 lines
6.1 KiB

  1. //
  2. // utbtray.h
  3. //
  4. #ifndef UTBTRAY_H
  5. #define UTBTRAY_H
  6. #include "ptrary.h"
  7. #include "cuibln.h"
  8. #include "slbarid.h"
  9. #include "nuiinat.h"
  10. class CTrayIconWnd;
  11. class CTipbarItem;
  12. #define WM_TIW_MAINICON (WM_USER + 0x0000)
  13. #define WM_TIW_MAINICON_DELAY (WM_USER + 0x0001)
  14. #define WM_TIW_WIN32IMEICON (WM_USER + 0x0002)
  15. #define WM_TIW_WIN32IMEICON_DELAY (WM_USER + 0x0003)
  16. #define WM_TIW_START (WM_USER + 0x1000)
  17. #define TIW_INDICATOR_ID_MAIN 0x0000
  18. #define TIW_INDICATOR_ID_WIN32IME 0x0001
  19. #define TIW_INDICATOR_ID_START 0x1000
  20. #define TIW_RAI_LEAVELANGICON 0x0001
  21. #define TIW_RAI_LEAVEKEYBOARDICON 0x0002
  22. extern const GUID GUID_LBI_TRAYMAIN;
  23. //////////////////////////////////////////////////////////////////////////////
  24. //
  25. // CTrayIconItem
  26. //
  27. //////////////////////////////////////////////////////////////////////////////
  28. class CTrayIconItem
  29. {
  30. public:
  31. CTrayIconItem(CTrayIconWnd *ptiwnd);
  32. virtual ~CTrayIconItem();
  33. BOOL _Init(HWND hwnd, UINT uCallbackMessage, UINT uID, REFGUID rguid);
  34. virtual BOOL SetIcon(HICON hIcon, const WCHAR *pszTooltip);
  35. BOOL RemoveIcon();
  36. virtual BOOL OnMsg(WPARAM wParam, LPARAM lParam) {return FALSE;}
  37. virtual BOOL OnDelayMsg(UINT uMsg) {return FALSE;}
  38. UINT GetMsg() {return _uCallbackMessage;}
  39. BOOL UpdateMenuRectPoint();
  40. const GUID *GetGuid() {return &_guidBtnItem;}
  41. UINT GetID() {return _uID;}
  42. BOOL IsShownInTray() {return _fShownInTray;}
  43. protected:
  44. HWND _hwnd;
  45. UINT _uCallbackMessage;
  46. UINT _uID;
  47. BOOL _fIconPrev;
  48. BOOL _fShownInTray;
  49. CTrayIconWnd *_ptiwnd;
  50. DWORD _dwThreadFocus;
  51. GUID _guidBtnItem;
  52. RECT _rcClick;
  53. POINT _ptClick;
  54. };
  55. //////////////////////////////////////////////////////////////////////////////
  56. //
  57. // CButtonIconItem
  58. //
  59. //////////////////////////////////////////////////////////////////////////////
  60. class CButtonIconItem : public CTrayIconItem
  61. {
  62. public:
  63. CButtonIconItem(CTrayIconWnd *ptiwnd, BOOL fMenuButtonItem);
  64. ~CButtonIconItem();
  65. virtual BOOL OnMsg(WPARAM wParam, LPARAM lParam);
  66. virtual BOOL OnDelayMsg(UINT uMsg);
  67. protected:
  68. BOOL _fMenuButtonItem;
  69. };
  70. //////////////////////////////////////////////////////////////////////////////
  71. //
  72. // CMainIconItem
  73. //
  74. //////////////////////////////////////////////////////////////////////////////
  75. class CMainIconItem : public CButtonIconItem
  76. {
  77. public:
  78. CMainIconItem(CTrayIconWnd *ptiwnd) : CButtonIconItem(ptiwnd, TRUE) {}
  79. ~CMainIconItem() {}
  80. BOOL Init(HWND hwnd)
  81. {
  82. return _Init(hwnd,
  83. WM_TIW_MAINICON,
  84. TIW_INDICATOR_ID_MAIN,
  85. GUID_LBI_TRAYMAIN);
  86. }
  87. virtual BOOL OnDelayMsg(UINT uMsg);
  88. HKL _hkl;
  89. };
  90. //////////////////////////////////////////////////////////////////////////////
  91. //
  92. // CTrayIconWnd
  93. //
  94. //////////////////////////////////////////////////////////////////////////////
  95. class CTrayIconWnd
  96. {
  97. public:
  98. CTrayIconWnd();
  99. ~CTrayIconWnd();
  100. HWND CreateWnd();
  101. HWND GetWnd() {return _hWnd;}
  102. void DestroyWnd()
  103. {
  104. DestroyWindow(_hWnd);
  105. _hWnd = NULL;
  106. }
  107. static BOOL RegisterClass();
  108. BOOL SetMainIcon(HKL hkl);
  109. HWND GetNotifyWnd()
  110. {
  111. if (!IsWindow(_hwndNotify))
  112. FindTrayEtc();
  113. return _hwndNotify;
  114. }
  115. BOOL SetIcon(REFGUID rguid, BOOL fMenu, HICON hIcon, const WCHAR *pszToolTip);
  116. void RemoveAllIcon(DWORD dwFlags)
  117. {
  118. int i;
  119. for (i = 0;i < _rgIconItems.Count(); i++)
  120. {
  121. CTrayIconItem *pItem = _rgIconItems.Get(i);
  122. if (dwFlags & TIW_RAI_LEAVELANGICON)
  123. {
  124. if (IsEqualGUID(*pItem->GetGuid(), GUID_LBI_INATITEM) ||
  125. IsEqualGUID(*pItem->GetGuid(), GUID_LBI_CTRL))
  126. continue;
  127. }
  128. if (dwFlags & TIW_RAI_LEAVEKEYBOARDICON)
  129. {
  130. if (IsEqualGUID(*pItem->GetGuid(), GUID_TFCAT_TIP_KEYBOARD))
  131. continue;
  132. }
  133. if (pItem->GetID() >= TIW_INDICATOR_ID_START)
  134. pItem->RemoveIcon();
  135. }
  136. return;
  137. }
  138. BOOL IsShownInTray(REFGUID rguid)
  139. {
  140. CTrayIconItem *pItem = FindIconItem(rguid);
  141. return pItem ? pItem->IsShownInTray() : FALSE;
  142. }
  143. void RemoveUnusedIcons(CPtrArray<CTipbarItem> *prgItem);
  144. BOOL _fShowExtraIcons;
  145. BOOL _fInTrayMenu;
  146. UINT _uCurCallbackMessage;
  147. UINT _uCurMouseMessage;
  148. void CallOnDelayMsg();
  149. DWORD GetThreadIdTray() {return _dwThreadIdTray;}
  150. DWORD GetThreadIdProgman() {return _dwThreadIdProgman;}
  151. private:
  152. static LRESULT CALLBACK _WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  153. HWND _hWnd;
  154. static const char _szWndClass[];
  155. static void SetThis(HWND hWnd, LPARAM lParam)
  156. {
  157. if (lParam)
  158. SetWindowLongPtr(hWnd, GWLP_USERDATA,
  159. (LONG_PTR)((CREATESTRUCT *)lParam)->lpCreateParams);
  160. else
  161. SetWindowLongPtr(hWnd, GWLP_USERDATA, 0);
  162. }
  163. static CTrayIconWnd *GetThis(HWND hWnd)
  164. {
  165. return (CTrayIconWnd *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
  166. }
  167. static BOOL CALLBACK EnumChildWndProc(HWND hwnd, LPARAM lParam);
  168. BOOL FindTrayEtc();
  169. HKL _hklCurrent;
  170. HICON _hiconWin32Current;
  171. HWND _hwndTray;
  172. HWND _hwndNotify;
  173. DWORD _dwThreadIdTray;
  174. DWORD _dwThreadIdForIcon;
  175. HWND _hwndProgman;
  176. DWORD _dwThreadIdProgman;
  177. BOOL OnIconMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
  178. CMainIconItem *_ptiiMain;
  179. CPtrArray<CTrayIconItem> _rgIconItems;
  180. CTrayIconItem *FindIconItem(REFGUID rguid)
  181. {
  182. int i;
  183. for (i = 0;i < _rgIconItems.Count(); i++)
  184. {
  185. CTrayIconItem *pItem = _rgIconItems.Get(i);
  186. if (IsEqualGUID(rguid, *pItem->GetGuid()))
  187. return pItem;
  188. }
  189. return NULL;
  190. }
  191. UINT _uNextMsg;
  192. UINT _uNextID;
  193. };
  194. #endif //UTBTRAY_H