Index: src/plugin/NotificationMessage.cpp |
=================================================================== |
new file mode 100644 |
--- /dev/null |
+++ b/src/plugin/NotificationMessage.cpp |
@@ -0,0 +1,100 @@ |
+#include <Windows.h> |
+#include <CommCtrl.h> |
+ |
+#include "NotificationMessage.h" |
+ |
+NotificationMessage::NotificationMessage() |
+{ |
+ CommonControlsInitialize(); |
+} |
+ |
+NotificationMessage::NotificationMessage(HWND parent) |
+{ |
+ parentWindow = parent; |
+ CommonControlsInitialize(); |
+}; |
+ |
+bool NotificationMessage::commonControlsInitialized(false); |
+ |
+void NotificationMessage::CommonControlsInitialize() |
+{ |
+ if (!commonControlsInitialized) |
+ { |
+ INITCOMMONCONTROLSEX commControls; |
+ commControls.dwSize = sizeof(INITCOMMONCONTROLSEX); |
+ commControls.dwICC = ICC_BAR_CLASSES; |
+ InitCommonControlsEx(&commControls); |
+ commonControlsInitialized = true; |
+ } |
+} |
+ |
+bool NotificationMessage::Show(std::wstring message, std::wstring title, int icon) |
+{ |
+ toolTipWindow = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, |
+ TTS_NOPREFIX | TTS_BALLOON | TTS_CLOSE, |
+ 0, 0, |
+ 0, 0, |
+ parentWindow, NULL, NULL, |
+ NULL); |
+ |
+ SetWindowPos(toolTipWindow, HWND_TOPMOST,0, 0, 0, 0, |
+ SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); |
+ TOOLINFO ti; |
Wladimir Palant
2013/09/19 08:59:16
We should declare this as TOOLINFOW explicitly.
|
+ ti.cbSize = sizeof(TOOLINFO); |
Wladimir Palant
2013/09/19 08:59:16
Indentation is off, convert tabs to spaces?
|
+ ti.uFlags = TTF_IDISHWND | TTF_TRACK | TTF_TRANSPARENT; |
+ ti.hwnd = toolTipWindow; |
+ ti.hinst = NULL; |
+ ti.uId = (UINT_PTR)parentWindow; |
+ ti.lpszText = (LPWSTR)message.c_str(); |
Wladimir Palant
2013/09/19 08:59:16
I think that the conversion to LPWSTR is unnecessa
Oleksandr
2013/09/25 10:03:14
We need to remove const here.
Wladimir Palant
2013/09/25 10:27:14
Please use const_cast to indicate that. It's a pit
|
+ GetClientRect(parentWindow, &ti.rect); |
+ |
+ LRESULT res = ::SendMessage(toolTipWindow, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); |
Wladimir Palant
2013/09/19 08:59:16
The conversion to LPTOOLINFO is unnecessary - &ti
|
+ |
+ RECT rect; |
+ GetWindowRect(parentWindow, &rect); |
+ Move(rect.left + (rect.right - rect.left) / 2, rect.top + (rect.bottom - rect.top) / 2); |
+ |
+ res = ::SendMessage(toolTipWindow, TTM_SETTITLE, icon, (LPARAM)title.c_str()); |
+ res = ::SendMessage(toolTipWindow, TTM_TRACKACTIVATE, TRUE, (LPARAM)(LPTOOLINFO) &ti); |
Wladimir Palant
2013/09/19 08:59:16
Same here, the conversion to LPTOOLINFO is unneces
|
+ |
+ return true; |
+} |
+ |
+bool NotificationMessage::Hide() |
+{ |
+ DestroyWindow(toolTipWindow); |
+ toolTipWindow = 0; |
+ return true; |
+} |
+ |
+void NotificationMessage::Move(short x, short y) |
+{ |
+ ::SendMessage(toolTipWindow, TTM_TRACKPOSITION, 0, (LPARAM)(LPTOOLINFO)MAKELONG(x, y)); |
Wladimir Palant
2013/09/19 08:59:16
The conversion to LPTOOLINFO is wrong here, that's
|
+ return; |
+} |
+ |
+bool NotificationMessage::SetTextAndIcon(std::wstring text, std::wstring title, int icon) |
+{ |
+ TOOLINFO ti; |
+ ti.cbSize = sizeof(TOOLINFO); |
Wladimir Palant
2013/09/19 08:59:16
As above, this should be TOOLINFOW.
|
+ ti.uFlags = TTF_IDISHWND | TTF_TRACK | TTF_TRANSPARENT; |
+ ti.hwnd = toolTipWindow; |
+ ti.hinst = NULL; |
+ ti.uId = (UINT_PTR)parentWindow; |
+ ti.lpszText = (LPWSTR)text.c_str(); |
Wladimir Palant
2013/09/19 08:59:16
As above, the conversion to LPWSTR seems unnecessa
|
+ GetClientRect(parentWindow, &ti.rect); |
+ LRESULT res = ::SendMessage(toolTipWindow, TTM_SETTITLE, icon, (LPARAM)title.c_str()); |
+ res = ::SendMessage(toolTipWindow, TTM_UPDATETIPTEXT, 0, (LPARAM)&ti); |
+ return res == TRUE; |
+} |
+ |
+void NotificationMessage::SetParent(HWND parent) |
+{ |
+ parentWindow = parent; |
+} |
+bool NotificationMessage::IsVisible() |
Wladimir Palant
2013/09/19 08:59:16
Nit: Empty line before this function.
|
+{ |
+ if (toolTipWindow == 0) |
+ return false; |
+ return IsWindowVisible(toolTipWindow); |
Wladimir Palant
2013/09/19 08:59:16
Given that we never hide the window but always des
Oleksandr
2013/09/25 10:03:14
The window may become hidden without us hiding it.
Wladimir Palant
2013/09/25 10:27:14
I see. We could react to WM_WINDOWPOSCHANGED then
Oleksandr
2013/09/25 12:37:45
Did that. Also if we do miss the NotificationMessa
|
+} |