X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/543a99218d11c45bddb4aaf72650caacd4b14549..7f35e5eeca672d1772daec728fbea68d668bc4ea:/src/msw/tooltip.cpp diff --git a/src/msw/tooltip.cpp b/src/msw/tooltip.cpp index 0f3f8558d8..909352209d 100644 --- a/src/msw/tooltip.cpp +++ b/src/msw/tooltip.cpp @@ -28,16 +28,21 @@ #include "wx/tooltip.h" #ifndef WX_PRECOMP + #include "wx/msw/wrapcctl.h" // include "properly" #include "wx/app.h" #include "wx/control.h" - #include "wx/combobox.h" #endif #include "wx/tokenzr.h" #include "wx/msw/private.h" -// include "properly" -#include "wx/msw/wrapcctl.h" +#ifndef TTTOOLINFO_V1_SIZE + #define TTTOOLINFO_V1_SIZE 0x28 +#endif + +#ifndef TTF_TRANSPARENT + #define TTF_TRANSPARENT 0x0100 +#endif // VZ: normally, the trick with subclassing the tooltip control and processing // TTM_WINDOWFROMPOINT should work but, somehow, it doesn't. I leave the @@ -81,20 +86,25 @@ public: ::ZeroMemory(this, sizeof(TOOLINFO)); // the structure TOOLINFO has been extended with a 4 byte field in - // version 4.70 of comctl32.dll and if we compile on a newer machine - // but run on one with the old version of comctl32, nothing will work - // because the library will detect that we rely on a more recent - // version of it. So we always use the old size - if we ever start - // using our lParam member, we'd have to check for comctl32 version - // during run-time -#if _WIN32_IE >= 0x0300 - cbSize = sizeof(TOOLINFO) - sizeof(LPARAM); -#else // old headers - cbSize = sizeof(TOOLINFO); -#endif // compile-time comctl32.dll version + // version 4.70 of comctl32.dll and another one in 5.01 but we don't + // use these extended fields so use the old struct size to ensure that + // the tooltips work on old (Windows 95) systems too + cbSize = TTTOOLINFO_V1_SIZE; hwnd = hwndOwner; uFlags = TTF_IDISHWND; + + // we use TTF_TRANSPARENT to fix a problem which arises at least with + // the text controls but may presumably happen with other controls + // which display the tooltip at mouse position: it can start flashing + // then as the control gets "focus lost" events and dismisses the + // tooltip which then reappears because mouse remains hovering over the + // control, see SF patch 1821229 + if ( wxApp::GetComCtl32Version() >= 470 ) + { + uFlags |= TTF_TRANSPARENT; + } + uId = (UINT)hwndOwner; } }; @@ -193,6 +203,18 @@ void wxToolTip::SetDelay(long milliseconds) TTDT_INITIAL, milliseconds); } +void wxToolTip::SetAutoPop(long milliseconds) +{ + SendTooltipMessageToAll(ms_hwndTT, TTM_SETDELAYTIME, + TTDT_AUTOPOP, milliseconds); +} + +void wxToolTip::SetReshow(long milliseconds) +{ + SendTooltipMessageToAll(ms_hwndTT, TTM_SETDELAYTIME, + TTDT_RESHOW, milliseconds); +} + // --------------------------------------------------------------------------- // implementation helpers // --------------------------------------------------------------------------- @@ -203,16 +225,23 @@ WXHWND wxToolTip::GetToolTipCtrl() { if ( !ms_hwndTT ) { + WXDWORD exflags = 0; + if ( wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft ) + { + exflags |= WS_EX_LAYOUTRTL; + } + // we want to show the tooltips always (even when the window is not // active) and we don't want to strip "&"s from them - ms_hwndTT = (WXHWND)::CreateWindow(TOOLTIPS_CLASS, - (LPCTSTR)NULL, - TTS_ALWAYSTIP | TTS_NOPREFIX, - CW_USEDEFAULT, CW_USEDEFAULT, - CW_USEDEFAULT, CW_USEDEFAULT, - NULL, (HMENU)NULL, - wxGetInstance(), - NULL); + ms_hwndTT = (WXHWND)::CreateWindowEx(exflags, + TOOLTIPS_CLASS, + (LPCTSTR)NULL, + TTS_ALWAYSTIP | TTS_NOPREFIX, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + NULL, (HMENU)NULL, + wxGetInstance(), + NULL); if ( ms_hwndTT ) { HWND hwnd = (HWND)ms_hwndTT; @@ -286,7 +315,7 @@ void wxToolTip::Add(WXHWND hWnd) // NMTTDISPINFO struct -- and setting the tooltip here we can have tooltips // of any length ti.hwnd = hwnd; - ti.lpszText = (wxChar *)m_text.c_str(); // const_cast + ti.lpszText = (wxChar *)m_text.wx_str(); // const_cast if ( !SendTooltipMessage(GetToolTipCtrl(), TTM_ADDTOOL, &ti) ) { @@ -334,13 +363,13 @@ void wxToolTip::Add(WXHWND hWnd) while (token.length()) { SIZE sz; - if ( !::GetTextExtentPoint32(hdc, token, token.length(), &sz) ) + if ( !::GetTextExtentPoint32(hdc, token.wx_str(), token.length(), &sz) ) { wxLogLastError(wxT("GetTextExtentPoint32")); } if ( sz.cx > max ) max = sz.cx; - + token = tokenizer.GetNextToken(); } @@ -355,7 +384,7 @@ void wxToolTip::Add(WXHWND hWnd) // replace the '\n's with spaces because otherwise they appear as // unprintable characters in the tooltip string m_text.Replace(_T("\n"), _T(" ")); - ti.lpszText = (wxChar *)m_text.c_str(); // const_cast + ti.lpszText = (wxChar *)m_text.wx_str(); // const_cast if ( !SendTooltipMessage(GetToolTipCtrl(), TTM_ADDTOOL, &ti) ) { @@ -378,7 +407,7 @@ void wxToolTip::SetWindow(wxWindow *win) Add(m_window->GetHWND()); } #if !defined(__WXUNIVERSAL__) - // and all of its subcontrols (e.g. radiobuttons in a radiobox) as well + // and all of its subcontrols (e.g. radio buttons in a radiobox) as well wxControl *control = wxDynamicCast(m_window, wxControl); if ( control ) { @@ -402,22 +431,6 @@ void wxToolTip::SetWindow(wxWindow *win) Add((WXHWND)hwnd); } } - - // VZ: it's ugly to do it here, but I don't want any major changes right - // now, later we will probably want to have wxWindow::OnGotToolTip() or - // something like this where the derived class can do such things - // itself instead of wxToolTip "knowing" about them all - wxComboBox *combo = wxDynamicCast(control, wxComboBox); - if ( combo ) - { - WXHWND hwndComboEdit = combo->GetWindowStyle() & wxCB_READONLY - ? combo->GetHWND() - : combo->GetEditHWND(); - if ( hwndComboEdit ) - { - Add(hwndComboEdit); - } - } #endif // !defined(__WXUNIVERSAL__) } @@ -429,7 +442,7 @@ void wxToolTip::SetTip(const wxString& tip) { // update the tip text shown by the control wxToolInfo ti(GetHwndOf(m_window)); - ti.lpszText = (wxChar *)m_text.c_str(); + ti.lpszText = (wxChar *)m_text.wx_str(); (void)SendTooltipMessage(GetToolTipCtrl(), TTM_UPDATETIPTEXT, &ti); }