Hide tooltip when its associated window is hidden in wxMSW.

Don't leave the tooltip shown on screen if the window it was shown for was
hidden or iconized (without moving the mouse, as that would have dismissed the
tooltip as well).

Closes #16265.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@76657 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2014-06-02 01:15:39 +00:00
parent 8f39cd1301
commit 35434eea52
3 changed files with 41 additions and 0 deletions

View File

@@ -69,6 +69,10 @@ public:
// makes sense to use it for tooltips associated with a single window only. // makes sense to use it for tooltips associated with a single window only.
void SetRect(const wxRect& rc); void SetRect(const wxRect& rc);
// Called when TLW shown state is changed and hides the tooltip itself if
// the window it's associated with is hidden.
static void UpdateVisibility();
private: private:
// Adds a window other than our main m_window to this tooltip. // Adds a window other than our main m_window to this tooltip.
void DoAddHWND(WXHWND hWnd); void DoAddHWND(WXHWND hWnd);

View File

@@ -298,6 +298,40 @@ WXHWND wxToolTip::GetToolTipCtrl()
return ms_hwndTT; return ms_hwndTT;
} }
/* static */
void wxToolTip::UpdateVisibility()
{
wxToolInfo ti(NULL, 0, wxRect());
ti.uFlags = 0;
if ( !SendTooltipMessage(ms_hwndTT, TTM_GETCURRENTTOOL, &ti) )
return;
wxWindow* const associatedWindow = wxFindWinFromHandle(ti.hwnd);
if ( !associatedWindow )
return;
bool hideTT = false;
if ( !associatedWindow->IsShownOnScreen() )
{
// If the associated window or its parent is hidden, the tooltip
// shouldn't remain shown.
hideTT = true;
}
else
{
// Even if it's not hidden, it could also be iconized.
wxTopLevelWindow* const
frame = wxDynamicCast(wxGetTopLevelParent(associatedWindow), wxTopLevelWindow);
if ( frame && frame->IsIconized() )
hideTT = true;
}
if ( hideTT )
::ShowWindow(ms_hwndTT, SW_HIDE);
}
/* static */ /* static */
void wxToolTip::RelayEvent(WXMSG *msg) void wxToolTip::RelayEvent(WXMSG *msg)
{ {

View File

@@ -717,6 +717,9 @@ void wxTopLevelWindowMSW::DoShowWindow(int nShowCmd)
// makes it not iconized and only minimizing it does make it iconized. // makes it not iconized and only minimizing it does make it iconized.
m_iconized = nShowCmd == SW_MINIMIZE; m_iconized = nShowCmd == SW_MINIMIZE;
} }
// Don't leave a tooltip hanging around if TLW is hidden now.
wxToolTip::UpdateVisibility();
} }
void wxTopLevelWindowMSW::ShowWithoutActivating() void wxTopLevelWindowMSW::ShowWithoutActivating()