]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/tooltip.cpp
Add detachmenu
[wxWidgets.git] / src / msw / tooltip.cpp
index 7829ec50e957bc18b4a1489b41b525fea6c120b3..f805bf6e754e8a2760ec276df609ab32c2bfb61e 100644 (file)
 #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
@@ -70,52 +79,13 @@ inline LRESULT SendTooltipMessage(WXHWND hwnd,
 }
 
 // send a message to all existing tooltip controls
-static void SendTooltipMessageToAll(UINT msg, WPARAM wParam, LPARAM lParam)
+static void SendTooltipMessageToAll(WXHWND hwnd,
+                                    UINT msg, 
+                                    WPARAM wParam, 
+                                    LPARAM lParam)
 {
-    // NB: it might be somewhat easier to maintain a list of all existing
-    //     wxToolTip controls (put them there in ctor, delete from the list
-    //     in dtor) - may be it's worth doing it this way? OTOH, typical
-    //     application won't have many top level windows, so iterating over all
-    //     of them shouldnt' take much time neither...
-
-    // iterate over all top level windows and send message to the tooltip
-    // control of each and every of them (or more precisely to all dialogs and
-    // frames)
-    wxDialog *dialog = NULL;
-    wxFrame *frame = NULL;
-
-    wxNode *node = wxTopLevelWindows.First();
-    while ( node )
-    {
-        wxWindow *win = (wxWindow *)node->Data();
-
-        node = node->Next();
-
-        if ( win->IsKindOf(CLASSINFO(wxFrame)) )
-        {
-            frame = (wxFrame *)win;
-            dialog = NULL;
-        }
-        else if ( win->IsKindOf(CLASSINFO(wxDialog)) )
-        {
-            dialog = (wxDialog *)win;
-            frame = NULL;
-        }
-        else
-        {
-            // skip this strange top level window
-            continue;
-        }
-
-        wxASSERT_MSG( dialog || frame, "logic error" );
-
-        WXHWND hwndTT = frame ? frame->GetToolTipCtrl()
-                              : dialog->GetToolTipCtrl();
-        if ( hwndTT )
-        {
-            (void)SendTooltipMessage(hwndTT, msg, wParam, (void *)lParam);
-        }
-    }
+   if ( hwnd )
+     (void)SendTooltipMessage((WXHWND)hwnd, msg, wParam, (void *)lParam);
 }
 
 // ============================================================================
@@ -126,14 +96,16 @@ static void SendTooltipMessageToAll(UINT msg, WPARAM wParam, LPARAM lParam)
 // static functions
 // ----------------------------------------------------------------------------
 
+
+
 void wxToolTip::Enable(bool flag)
 {
-    SendTooltipMessageToAll(TTM_ACTIVATE, flag, 0);
+    SendTooltipMessageToAll((WXHWND)hwndTT,TTM_ACTIVATE, flag, 0);
 }
 
 void wxToolTip::SetDelay(long milliseconds)
 {
-    SendTooltipMessageToAll(TTM_SETDELAYTIME, TTDT_INITIAL, milliseconds);
+    SendTooltipMessageToAll((WXHWND)hwndTT,TTM_SETDELAYTIME, TTDT_INITIAL, milliseconds);
 }
 
 // ---------------------------------------------------------------------------
@@ -143,36 +115,6 @@ void wxToolTip::SetDelay(long milliseconds)
 // create the tooltip ctrl for our parent frame if it doesn't exist yet
 WXHWND wxToolTip::GetToolTipCtrl()
 {
-    // find either parent dialog or parent frame - tooltip controls are managed
-    // by these 2 classes only (it doesn't make sense to create one tooltip per
-    // each and every wxWindow)
-    wxFrame *frame = NULL;
-    wxDialog *dialog = NULL;
-
-    wxWindow *parent = m_window;
-    while ( parent )
-    {
-        if ( parent->IsKindOf(CLASSINFO(wxFrame)) )
-        {
-            frame = (wxFrame *)parent;
-
-            break;
-        }
-        else if ( parent->IsKindOf(CLASSINFO(wxDialog)) )
-        {
-            dialog = (wxDialog *)parent;
-
-            break;
-        }
-
-        parent = parent->GetParent();
-    }
-
-    wxCHECK_MSG( frame || dialog, 0,
-                 "can't create tooltip control outside a frame or a dialog" );
-
-    HWND hwndTT = (HWND)(frame ? frame->GetToolTipCtrl()
-                                 : dialog->GetToolTipCtrl());
     if ( !hwndTT )
     {
         hwndTT = ::CreateWindow(TOOLTIPS_CLASS,
@@ -180,20 +122,8 @@ 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 )
-        {
-            if ( frame )
-                frame->SetToolTipCtrl((WXHWND)hwndTT);
-            else
-                dialog->SetToolTipCtrl((WXHWND)hwndTT);
-        }
-        else
-        {
-            wxLogSysError(_("Can not create tooltip control"));
-        }
     }
 
     return (WXHWND)hwndTT;
@@ -267,7 +197,7 @@ 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);
     }