tray_icon.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #ifndef TRAY_ICON_H_
  2. #define TRAY_ICON_H_
  3. #include <Windows.h>
  4. #include <shellapi.h>
  5. #include <string>
  6. #include <map>
  7. #include <assert.h>
  8. #include <TCHAR.H>
  9. struct TrayIconListener;
  10. class TrayIcon {
  11. public:
  12. explicit TrayIcon(LPCWSTR name = L"",
  13. bool visible = false, HICON hIcon = NULL, bool destroyIconInDestructor = false);
  14. virtual ~TrayIcon();
  15. virtual void setName(LPCWSTR name);
  16. LPCWSTR getName() const { return m_name.c_str(); }
  17. virtual bool setVisible(bool visible);
  18. bool isVisible() const { return m_visible; }
  19. // The destructor may destroy the specified hIcon. If you want to avoid that, call
  20. // setIcon(NULL, false) or setDestroyIconInDestructor(false).
  21. virtual void setIcon(HICON hNewIcon, bool destroyCurrentIcon = true);
  22. HICON getIcon() const { return m_hIcon; }
  23. void setDestroyIconInDestructor(bool b) { m_destroyIconInDestructor = b; }
  24. bool getDestroyIconInDestructor() const { return m_destroyIconInDestructor; }
  25. enum NotificationIcon {
  26. iconNone, // NIIF_NONE(0)
  27. iconInfo, // NIIF_INFO(1)
  28. iconWarning, // NIIF_WARNING(2)
  29. iconError // NIIF_ERROR(3)
  30. };
  31. bool notify(LPCWSTR title, LPCWSTR msg, NotificationIcon icon = iconNone);
  32. typedef void (*TrayIconMessageFunc)(TrayIcon* pTrayIcon, UINT uMsg);
  33. void setListener(TrayIconMessageFunc func) { m_messageFunc = func; }
  34. void setListener(TrayIconListener *listener) { m_listener = listener; }
  35. void setUserData(const void* data) { m_userData = data; }
  36. const void* getUserData() { return m_userData; }
  37. protected:
  38. virtual void onMessage(UINT uMsg);
  39. private:
  40. void fillNotifyIconData(NOTIFYICONDATAW& data);
  41. HICON internalGetIcon() const;
  42. bool addIcon();
  43. bool removeIcon();
  44. void onTaskbarCreated();
  45. private:
  46. UINT m_id;
  47. std::wstring m_name;
  48. HICON m_hIcon;
  49. bool m_visible;
  50. bool m_destroyIconInDestructor;
  51. TrayIconMessageFunc m_messageFunc;
  52. TrayIconListener* m_listener;
  53. const void* m_userData;
  54. static LRESULT CALLBACK MessageProcessorWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  55. static HWND GetMessageProcessorHWND();
  56. };
  57. struct TrayIconListener {
  58. virtual void onTrayIconMouseMove(TrayIcon* pTrayIcon) {}
  59. virtual void onTrayIconLButtonDown(TrayIcon* pTrayIcon) {}
  60. virtual void onTrayIconLButtonUp(TrayIcon* pTrayIcon) {}
  61. virtual void onTrayIconLButtonDblClk(TrayIcon* pTrayIcon) {}
  62. virtual void onTrayIconRButtonDown(TrayIcon* pTrayIcon) {}
  63. virtual void onTrayIconRButtonUp(TrayIcon* pTrayIcon) {}
  64. virtual void onTrayIconRButtonDblClk(TrayIcon* pTrayIcon) {}
  65. virtual void onTrayIconMButtonDown(TrayIcon* pTrayIcon) {}
  66. virtual void onTrayIconMButtonUp(TrayIcon* pTrayIcon) {}
  67. virtual void onTrayIconMButtonDblClk(TrayIcon* pTrayIcon) {}
  68. virtual void onTrayIconSelect(TrayIcon* pTrayIcon) {}
  69. virtual void onTrayIconBalloonShow(TrayIcon* pTrayIcon) {}
  70. virtual void onTrayIconBalloonHide(TrayIcon* pTrayIcon) {}
  71. virtual void onTrayIconBalloonTimeout(TrayIcon* pTrayIcon) {}
  72. virtual void onTrayIconBalloonUserClick(TrayIcon* pTrayIcon) {}
  73. // Use GetCursorPos() if you need the location of the cursor.
  74. virtual void onTrayIconMessage(TrayIcon* pTrayIcon, UINT uMsg) {
  75. switch (uMsg) {
  76. case WM_MOUSEMOVE: onTrayIconMouseMove(pTrayIcon); break;
  77. case WM_LBUTTONDOWN: onTrayIconLButtonDown(pTrayIcon); break;
  78. case WM_LBUTTONUP: onTrayIconLButtonUp(pTrayIcon); break;
  79. case WM_LBUTTONDBLCLK: onTrayIconLButtonDblClk(pTrayIcon); break;
  80. case WM_RBUTTONDOWN: onTrayIconRButtonDown(pTrayIcon); break;
  81. case WM_RBUTTONUP: onTrayIconRButtonUp(pTrayIcon); break;
  82. case WM_RBUTTONDBLCLK: onTrayIconRButtonDblClk(pTrayIcon); break;
  83. case WM_MBUTTONDOWN: onTrayIconMButtonDown(pTrayIcon); break;
  84. case WM_MBUTTONUP: onTrayIconMButtonUp(pTrayIcon); break;
  85. case WM_MBUTTONDBLCLK: onTrayIconMButtonDblClk(pTrayIcon); break;
  86. #ifdef NIN_SELECT
  87. case NIN_SELECT: onTrayIconSelect(pTrayIcon); break;
  88. case NIN_BALLOONSHOW: onTrayIconBalloonShow(pTrayIcon); break;
  89. case NIN_BALLOONHIDE: onTrayIconBalloonHide(pTrayIcon); break;
  90. case NIN_BALLOONTIMEOUT: onTrayIconBalloonTimeout(pTrayIcon); break;
  91. case NIN_BALLOONUSERCLICK: onTrayIconBalloonUserClick(pTrayIcon); break;
  92. #endif
  93. }
  94. }
  95. };
  96. #endif // TRAY_ICON_H_