]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/tooltip.cpp
OpenVMS compile support update
[wxWidgets.git] / src / msw / tooltip.cpp
index 84f9a38084fd887667e2472d759976de7e33edbd..0f3f8558d8dafc995fb1e29dec476f8ae39e22b5 100644 (file)
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////////
-// Name:        msw/tooltip.cpp
+// Name:        src/msw/tooltip.cpp
 // Purpose:     wxToolTip class implementation for MSW
 // Author:      Vadim Zeitlin
 // Modified by:
     #pragma hdrstop
 #endif
 
-#ifndef WX_PRECOMP
-    #include "wx/wx.h"
-#endif
-
 #if wxUSE_TOOLTIPS
 
 #include "wx/tooltip.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/app.h"
+    #include "wx/control.h"
+    #include "wx/combobox.h"
+#endif
+
+#include "wx/tokenzr.h"
 #include "wx/msw/private.h"
 
 // include <commctrl.h> "properly"
@@ -194,13 +198,16 @@ void wxToolTip::SetDelay(long milliseconds)
 // ---------------------------------------------------------------------------
 
 // create the tooltip ctrl for our parent frame if it doesn't exist yet
+/* static */
 WXHWND wxToolTip::GetToolTipCtrl()
 {
     if ( !ms_hwndTT )
     {
+        // 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_ALWAYSTIP | TTS_NOPREFIX,
                                            CW_USEDEFAULT, CW_USEDEFAULT,
                                            CW_USEDEFAULT, CW_USEDEFAULT,
                                            NULL, (HMENU)NULL,
@@ -222,6 +229,7 @@ WXHWND wxToolTip::GetToolTipCtrl()
     return ms_hwndTT;
 }
 
+/* static */
 void wxToolTip::RelayEvent(WXMSG *msg)
 {
     (void)SendTooltipMessage(GetToolTipCtrl(), TTM_RELAYEVENT, msg);
@@ -242,8 +250,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();
 }
 
 // ----------------------------------------------------------------------------
@@ -319,14 +327,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