]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/tooltip.cpp
Add detachmenu
[wxWidgets.git] / src / msw / tooltip.cpp
index 7fe905694920f7e90e22ce6daa2953b84b04b5f4..f805bf6e754e8a2760ec276df609ab32c2bfb61e 100644 (file)
     #include "wx/wx.h"
 #endif
 
+#if wxUSE_TOOLTIPS
+
 #include "wx/tooltip.h"
 #include "wx/msw/private.h"
 
-#if (defined(__WIN95__) && !defined(__GNUWIN32__)) || defined(__TWIN32__)
+#if (defined(__WIN95__) && !defined(__GNUWIN32__)) || defined(__TWIN32__) || defined(wxUSE_NORLANDER_HEADERS)
 #include <commctrl.h>
 #endif
 
+HWND wxToolTip::hwndTT = NULL;
+
 // ----------------------------------------------------------------------------
 // private classes
 // ----------------------------------------------------------------------------
 
+
 // a simple wrapper around TOOLINFO Win32 structure
+#pragma warning( disable : 4097 )
 class wxToolInfo : public TOOLINFO
 {
 public:
     wxToolInfo(wxWindow *win)
     {
         // initialize all members
+#ifdef __GNUWIN32__ && !defined(wxUSE_NORLANDER_HEADERS)
+        memset(this, 0, sizeof(TOOLINFO));
+#else
         ::ZeroMemory(this, sizeof(TOOLINFO));
+#endif
 
         cbSize = sizeof(TOOLINFO);
         uFlags = TTF_IDISHWND;
         uId = (UINT)win->GetHWND();
     }
 };
+#pragma warning( default : 4097 )
 
 // ----------------------------------------------------------------------------
 // private functions
@@ -67,28 +78,43 @@ inline LRESULT SendTooltipMessage(WXHWND hwnd,
                 : 0;
 }
 
+// send a message to all existing tooltip controls
+static void SendTooltipMessageToAll(WXHWND hwnd,
+                                    UINT msg, 
+                                    WPARAM wParam, 
+                                    LPARAM lParam)
+{
+   if ( hwnd )
+     (void)SendTooltipMessage((WXHWND)hwnd, msg, wParam, (void *)lParam);
+}
+
 // ============================================================================
 // implementation
 // ============================================================================
 
 // ----------------------------------------------------------------------------
-// "semiglobal" functions - these methods work with the tooltip control which
-// is shared among all the wxToolTips of the same frame
+// static functions
 // ----------------------------------------------------------------------------
 
-// create the tooltip ctrl for our parent frame if it doesn't exist yet
-WXHWND wxToolTip::GetToolTipCtrl()
+
+
+void wxToolTip::Enable(bool flag)
 {
-    wxWindow *parent = m_window;
-    while ( parent && !parent->IsKindOf(CLASSINFO(wxFrame)) )
-    {
-        parent = parent->GetParent();
-    }
+    SendTooltipMessageToAll((WXHWND)hwndTT,TTM_ACTIVATE, flag, 0);
+}
+
+void wxToolTip::SetDelay(long milliseconds)
+{
+    SendTooltipMessageToAll((WXHWND)hwndTT,TTM_SETDELAYTIME, TTDT_INITIAL, milliseconds);
+}
 
-    wxCHECK_MSG( parent, 0, "can't create tooltip control outside a frame" );
+// ---------------------------------------------------------------------------
+// implementation helpers
+// ---------------------------------------------------------------------------
 
-    wxFrame *frame = (wxFrame *)parent;
-    HWND hwndTT = (HWND)frame->GetToolTipCtrl();
+// create the tooltip ctrl for our parent frame if it doesn't exist yet
+WXHWND wxToolTip::GetToolTipCtrl()
+{
     if ( !hwndTT )
     {
         hwndTT = ::CreateWindow(TOOLTIPS_CLASS,
@@ -96,38 +122,18 @@ WXHWND wxToolTip::GetToolTipCtrl()
                                 TTS_ALWAYSTIP,
                                 CW_USEDEFAULT, CW_USEDEFAULT,
                                 CW_USEDEFAULT, CW_USEDEFAULT,
-                                (HWND)frame->GetHWND(), (HMENU)NULL,
+                                NULL, (HMENU)NULL,
                                 wxGetInstance(), NULL);
-
-        if ( hwndTT )
-        {
-            frame->SetToolTipCtrl((WXHWND)hwndTT);
-        }
-        else
-        {
-            wxLogSysError(_("Can not create tooltip control"));
-        }
     }
 
     return (WXHWND)hwndTT;
 }
 
-void wxToolTip::Enable(bool flag)
-{
-    (void)SendTooltipMessage(GetToolTipCtrl(), TTM_ACTIVATE, flag, 0);
-}
-
 void wxToolTip::RelayEvent(WXMSG *msg)
 {
     (void)SendTooltipMessage(GetToolTipCtrl(), TTM_RELAYEVENT, 0, msg);
 }
 
-void wxToolTip::SetDelay(long milliseconds)
-{
-    (void)SendTooltipMessage(GetToolTipCtrl(), TTM_SETDELAYTIME,
-                             TTDT_INITIAL, (void *)milliseconds);
-}
-
 // ----------------------------------------------------------------------------
 // ctor & dtor
 // ----------------------------------------------------------------------------
@@ -191,8 +197,10 @@ void wxToolTip::SetTip(const wxString& tip)
     {
         // update it immediately
         wxToolInfo ti(m_window);
-        ti.lpszText = (char *)m_text.c_str();
+        ti.lpszText = (wxChar *)m_text.c_str();
 
         (void)SendTooltipMessage(GetToolTipCtrl(), TTM_UPDATETIPTEXT, 0, &ti);
     }
 }
+
+#endif // wxUSE_TOOLTIPS