X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0c5405b727fc4a1ff66c1ded7e2a2da54d0d3718..8cb475f139b67c75f744c6060785812082df0758:/src/msw/tooltip.cpp?ds=sidebyside diff --git a/src/msw/tooltip.cpp b/src/msw/tooltip.cpp index 84f9a38084..0b705200f7 100644 --- a/src/msw/tooltip.cpp +++ b/src/msw/tooltip.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: msw/tooltip.cpp +// Name: src/msw/tooltip.cpp // Purpose: wxToolTip class implementation for MSW // Author: Vadim Zeitlin // Modified by: @@ -23,17 +23,19 @@ #pragma hdrstop #endif -#ifndef WX_PRECOMP - #include "wx/wx.h" -#endif - #if wxUSE_TOOLTIPS #include "wx/tooltip.h" -#include "wx/msw/private.h" -// include "properly" -#include "wx/msw/wrapcctl.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" // VZ: normally, the trick with subclassing the tooltip control and processing // TTM_WINDOWFROMPOINT should work but, somehow, it doesn't. I leave the @@ -189,23 +191,45 @@ 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 // --------------------------------------------------------------------------- // create the tooltip ctrl for our parent frame if it doesn't exist yet +/* static */ WXHWND wxToolTip::GetToolTipCtrl() { if ( !ms_hwndTT ) { - ms_hwndTT = (WXHWND)::CreateWindow(TOOLTIPS_CLASS, - (LPCTSTR)NULL, - TTS_ALWAYSTIP, - CW_USEDEFAULT, CW_USEDEFAULT, - CW_USEDEFAULT, CW_USEDEFAULT, - NULL, (HMENU)NULL, - wxGetInstance(), - NULL); + 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)::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; @@ -222,6 +246,7 @@ WXHWND wxToolTip::GetToolTipCtrl() return ms_hwndTT; } +/* static */ void wxToolTip::RelayEvent(WXMSG *msg) { (void)SendTooltipMessage(GetToolTipCtrl(), TTM_RELAYEVENT, msg); @@ -242,8 +267,8 @@ wxToolTip::wxToolTip(const wxString &tip) wxToolTip::~wxToolTip() { // the tooltip has to be removed before deleting. Otherwise, if it is visible - // while being deleted, there will be a delay before it goes away. - Remove(); + // while being deleted, there will be a delay before it goes away. + Remove(); } // ---------------------------------------------------------------------------- @@ -278,7 +303,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) ) { @@ -319,14 +344,27 @@ void wxToolTip::Add(WXHWND hWnd) wxLogLastError(wxT("SelectObject(hfont)")); } - SIZE sz; - if ( !::GetTextExtentPoint32(hdc, m_text, index, &sz) ) + // find the width of the widest line + int max = 0; + wxStringTokenizer tokenizer(m_text, _T("\n")); + wxString token = tokenizer.GetNextToken(); + while (token.length()) { - wxLogLastError(wxT("GetTextExtentPoint32")); + SIZE sz; + if ( !::GetTextExtentPoint32(hdc, token.wx_str(), token.length(), &sz) ) + { + wxLogLastError(wxT("GetTextExtentPoint32")); + } + if ( sz.cx > max ) + max = sz.cx; + + token = tokenizer.GetNextToken(); } - SendTooltipMessage(GetToolTipCtrl(), TTM_SETMAXTIPWIDTH, - (void *)sz.cx); + // only set a new width if it is bigger than the current setting + if (max > SendTooltipMessage(GetToolTipCtrl(), TTM_GETMAXTIPWIDTH, 0)) + SendTooltipMessage(GetToolTipCtrl(), TTM_SETMAXTIPWIDTH, + (void *)max); } else #endif // comctl32.dll >= 4.70 @@ -334,7 +372,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) ) { @@ -408,7 +446,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); }