Files
foobar2000-sdk/libPPUI/CPopupTooltipMessage.h
2021-12-14 00:28:25 -07:00

102 lines
2.7 KiB
C++

#pragma once
#include "win32_op.h"
#include "wtl-pp.h"
class CPopupTooltipMessage {
public:
CPopupTooltipMessage(DWORD style = TTS_BALLOON | TTS_NOPREFIX) : m_style(style | WS_POPUP), m_toolinfo(), m_shutDown() {}
void ShowFocus(const TCHAR * message, CWindow wndParent) {
Show(message, wndParent); wndParent.SetFocus();
}
void Show(const TCHAR * message, CWindow wndParent) {
if (m_shutDown || (message == NULL && m_tooltip.m_hWnd == NULL)) return;
Initialize();
Hide();
if (message != NULL) {
CRect rect;
WIN32_OP_D(wndParent.GetWindowRect(rect));
ShowInternal(message, wndParent, rect);
}
}
void ShowEx(const TCHAR * message, CWindow wndParent, CRect rect) {
if (m_shutDown) return;
Initialize();
Hide();
ShowInternal(message, wndParent, rect);
}
void Hide() {
if (m_tooltip.m_hWnd != NULL && m_tooltip.GetToolCount() > 0) {
m_tooltip.TrackActivate(&m_toolinfo, FALSE);
m_tooltip.DelTool(&m_toolinfo);
}
}
void CleanUp() {
if (m_tooltip.m_hWnd != NULL) {
m_tooltip.DestroyWindow();
}
}
void ShutDown() {
m_shutDown = true; CleanUp();
}
private:
void ShowInternal(const TCHAR * message, CWindow wndParent, CRect rect) {
PFC_ASSERT(!m_shutDown);
PFC_ASSERT(message != NULL);
PFC_ASSERT(wndParent != NULL);
if (_tcschr(message, '\n') != nullptr) {
m_tooltip.SetMaxTipWidth(rect.Width());
}
m_toolinfo.cbSize = sizeof(m_toolinfo);
m_toolinfo.uFlags = TTF_TRACK | TTF_IDISHWND | TTF_ABSOLUTE | TTF_TRANSPARENT | TTF_CENTERTIP;
m_toolinfo.hwnd = wndParent;
m_toolinfo.uId = 0;
m_toolinfo.lpszText = const_cast<TCHAR*>(message);
m_toolinfo.hinst = NULL; //core_api::get_my_instance();
if (m_tooltip.AddTool(&m_toolinfo)) {
m_tooltip.TrackPosition(rect.CenterPoint().x, rect.bottom);
m_tooltip.TrackActivate(&m_toolinfo, TRUE);
}
}
void Initialize() {
if (m_tooltip.m_hWnd == NULL) {
WIN32_OP(m_tooltip.Create(NULL, NULL, NULL, m_style));
}
}
CContainedWindowSimpleT<CToolTipCtrl> m_tooltip;
TOOLINFO m_toolinfo;
const DWORD m_style;
bool m_shutDown;
};
template<typename T> class CDialogWithTooltip : public CDialogImpl<T> {
public:
BEGIN_MSG_MAP_EX(CDialogWithTooltip)
MSG_WM_DESTROY(OnDestroy)
END_MSG_MAP()
void ShowTip(UINT id, const TCHAR * label) {
m_tip.Show(label, this->GetDlgItem(id));
}
void ShowTip(HWND child, const TCHAR * label) {
m_tip.Show(label, child);
}
void ShowTipF(UINT id, const TCHAR * label) {
m_tip.ShowFocus(label, this->GetDlgItem(id));
}
void ShowTipF(HWND child, const TCHAR * label) {
m_tip.ShowFocus(label, child);
}
void HideTip() { m_tip.Hide(); }
private:
void OnDestroy() { m_tip.ShutDown(); this->SetMsgHandled(FALSE); }
CPopupTooltipMessage m_tip;
};