-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathTrayIcon.h
More file actions
140 lines (114 loc) · 5.14 KB
/
TrayIcon.h
File metadata and controls
140 lines (114 loc) · 5.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
* Copyright (c) Istvan Pasztor
* This source has been published on www.codeproject.com under the CPOL license.
*/
#ifndef __TRAY_ICON_H__
#define __TRAY_ICON_H__
#pragma once
// NOTE: include the following headers in your stdafx.h: <shellapi.h> <map> <string> <assert.h>
struct ITrayIconListener;
// You can use this class either by inheriting from it and overriding the OnMessage() method,
// or by instantiating this class directly and setting its listener object or function.
class CTrayIcon
{
public:
CTrayIcon(const char* name="tray_icon", bool visible=false, HICON hIcon=NULL, bool destroy_icon_in_destructor=false);
// destroys the current m_hIcon if set
virtual ~CTrayIcon();
virtual void SetName(const char* name);
const char* GetName() const { return m_Name.c_str(); }
virtual bool SetVisible(bool visible);
bool IsVisible() const { return m_Visible; }
// The destructor may destroy the specified hIcon. If you want to avoid that, call
// SetIcon(NULL, false) or SetDestroyIconInDestructor(false).
virtual void SetIcon(HICON hNewIcon, bool destroy_current_icon=true);
HICON GetIcon() const { return m_hIcon; }
void SetDestroyIconInDestructor(bool b) { m_DestroyIconInDestructor = b; }
bool GetDestroyIconInDestructor() const { return m_DestroyIconInDestructor; }
enum ETooltipIcon
{
eTI_None, // NIIF_NONE(0)
eTI_Info, // NIIF_INFO(1)
eTI_Warning, // NIIF_WARNING(2)
eTI_Error // NIIF_ERROR(3)
};
// ShowBalloonTooltip() works only on win2k and later
bool ShowBalloonTooltip(const char* title, const char* msg, ETooltipIcon icon=eTI_None);
typedef void (*POnMessageFunc)(CTrayIcon* pTrayIcon, UINT uMsg);
void SetListener(POnMessageFunc pOnMessageFunc) { m_pOnMessageFunc = pOnMessageFunc; }
void SetListener(ITrayIconListener *pListener) { m_pListener = pListener; }
protected:
// uMsg can be one of the following window messages:
// - WM_MOUSEMOVE
// - WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK
// - WM_RBUTTONDOWN, WM_RBUTTONUP, WM_RBUTTONDBLCLK
// - WM_MBUTTONDOWN, WM_MBUTTONUP, WM_MBUTTONDBLCLK
// WinXP and later:
// - NIN_BALLOONXXX messages (eg.: NIN_BALLOONUSERCLICK)
//
// Use GetCursorPos() if you need the location of the cursor.
// The default implementation calls the listener.
virtual void OnMessage(UINT uMsg);
private:
void FillNotifyIconData(NOTIFYICONDATAA& data);
// Never returns NULL! If GetIcon()==NULL, then this returns a system icon
HICON InternalGetIcon() const;
bool AddIcon();
bool RemoveIcon();
void OnTaskbarCreated();
private:
UINT m_Id;
std::string m_Name;
bool m_Visible;
HICON m_hIcon;
bool m_DestroyIconInDestructor;
POnMessageFunc m_pOnMessageFunc;
ITrayIconListener* m_pListener;
static LRESULT CALLBACK MessageProcessorWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
static HWND GetMessageProcessorHWND();
};
//-------------------------------------------------------------------------------------------------
struct ITrayIconListener
{
virtual void OnTrayIconMouseMove(CTrayIcon* pTrayIcon) {}
virtual void OnTrayIconLButtonDown(CTrayIcon* pTrayIcon) {}
virtual void OnTrayIconLButtonUp(CTrayIcon* pTrayIcon) {}
virtual void OnTrayIconLButtonDblClk(CTrayIcon* pTrayIcon) {}
virtual void OnTrayIconRButtonDown(CTrayIcon* pTrayIcon) {}
virtual void OnTrayIconRButtonUp(CTrayIcon* pTrayIcon) {}
virtual void OnTrayIconRButtonDblClk(CTrayIcon* pTrayIcon) {}
virtual void OnTrayIconMButtonDown(CTrayIcon* pTrayIcon) {}
virtual void OnTrayIconMButtonUp(CTrayIcon* pTrayIcon) {}
virtual void OnTrayIconMButtonDblClk(CTrayIcon* pTrayIcon) {}
// WinXP and later
virtual void OnTrayIconSelect(CTrayIcon* pTrayIcon) {}
virtual void OnTrayIconBalloonShow(CTrayIcon* pTrayIcon) {}
virtual void OnTrayIconBalloonHide(CTrayIcon* pTrayIcon) {}
virtual void OnTrayIconBalloonTimeout(CTrayIcon* pTrayIcon) {}
virtual void OnTrayIconBalloonUserClick(CTrayIcon* pTrayIcon) {}
// Use GetCursorPos() if you need the location of the cursor.
virtual void OnTrayIconMessage(CTrayIcon* pTrayIcon, UINT uMsg)
{
switch (uMsg)
{
case WM_MOUSEMOVE: OnTrayIconMouseMove(pTrayIcon); break;
case WM_LBUTTONDOWN: OnTrayIconLButtonDown(pTrayIcon); break;
case WM_LBUTTONUP: OnTrayIconLButtonUp(pTrayIcon); break;
case WM_LBUTTONDBLCLK: OnTrayIconLButtonDblClk(pTrayIcon); break;
case WM_RBUTTONDOWN: OnTrayIconRButtonDown(pTrayIcon); break;
case WM_RBUTTONUP: OnTrayIconRButtonUp(pTrayIcon); break;
case WM_RBUTTONDBLCLK: OnTrayIconRButtonDblClk(pTrayIcon); break;
case WM_MBUTTONDOWN: OnTrayIconMButtonDown(pTrayIcon); break;
case WM_MBUTTONUP: OnTrayIconMButtonUp(pTrayIcon); break;
case WM_MBUTTONDBLCLK: OnTrayIconMButtonDblClk(pTrayIcon); break;
#ifdef NIN_SELECT
case NIN_SELECT: OnTrayIconSelect(pTrayIcon); break;
case NIN_BALLOONSHOW: OnTrayIconBalloonShow(pTrayIcon); break;
case NIN_BALLOONHIDE: OnTrayIconBalloonHide(pTrayIcon); break;
case NIN_BALLOONTIMEOUT: OnTrayIconBalloonTimeout(pTrayIcon); break;
case NIN_BALLOONUSERCLICK: OnTrayIconBalloonUserClick(pTrayIcon); break;
#endif
}
}
};
#endif //!__TRAY_ICON_H__