X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/623d5f80029803f1394e89732e16e19e82a22e2a..01f512d7fc2af9ce64adc85937766722b8fc38c5:/src/msw/tooltip.cpp diff --git a/src/msw/tooltip.cpp b/src/msw/tooltip.cpp index fe6f37ee05..aa5388cf2d 100644 --- a/src/msw/tooltip.cpp +++ b/src/msw/tooltip.cpp @@ -28,16 +28,15 @@ #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" - // VZ: normally, the trick with subclassing the tooltip control and processing // TTM_WINDOWFROMPOINT should work but, somehow, it doesn't. I leave the // code here for now (but it's not compiled) in case we need it later. @@ -202,16 +201,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; @@ -326,14 +332,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, 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