X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/acbd13a365fe2bd7ed6bafd19dc26775a256d499..0ae2df30524bb07bcca824bd0a842bd54a305ff3:/src/msw/tooltip.cpp diff --git a/src/msw/tooltip.cpp b/src/msw/tooltip.cpp index 7fe9056949..ca76d82573 100644 --- a/src/msw/tooltip.cpp +++ b/src/msw/tooltip.cpp @@ -27,10 +27,12 @@ #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 #endif @@ -45,7 +47,11 @@ public: wxToolInfo(wxWindow *win) { // initialize all members +#if defined( __GNUWIN32__ ) && !defined(wxUSE_NORLANDER_HEADERS) + memset(this, 0, sizeof(TOOLINFO)); +#else ::ZeroMemory(this, sizeof(TOOLINFO)); +#endif cbSize = sizeof(TOOLINFO); uFlags = TTF_IDISHWND; @@ -67,28 +73,110 @@ inline LRESULT SendTooltipMessage(WXHWND hwnd, : 0; } +// send a message to all existing tooltip controls +static void SendTooltipMessageToAll(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, _T("logic error") ); + + WXHWND hwndTT = frame ? frame->GetToolTipCtrl() + : dialog->GetToolTipCtrl(); + if ( hwndTT ) + { + (void)SendTooltipMessage(hwndTT, 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 // ---------------------------------------------------------------------------- +void wxToolTip::Enable(bool flag) +{ + SendTooltipMessageToAll(TTM_ACTIVATE, flag, 0); +} + +void wxToolTip::SetDelay(long milliseconds) +{ + SendTooltipMessageToAll(TTM_SETDELAYTIME, TTDT_INITIAL, milliseconds); +} + +// --------------------------------------------------------------------------- +// implementation helpers +// --------------------------------------------------------------------------- + // 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 && !parent->IsKindOf(CLASSINFO(wxFrame)) ) + 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( parent, 0, "can't create tooltip control outside a frame" ); + wxCHECK_MSG( frame || dialog, 0, + _T("can't create tooltip control outside a frame or a dialog") ); - wxFrame *frame = (wxFrame *)parent; - HWND hwndTT = (HWND)frame->GetToolTipCtrl(); + HWND hwndTT = (HWND)(frame ? frame->GetToolTipCtrl() + : dialog->GetToolTipCtrl()); if ( !hwndTT ) { hwndTT = ::CreateWindow(TOOLTIPS_CLASS, @@ -96,12 +184,15 @@ WXHWND wxToolTip::GetToolTipCtrl() TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, - (HWND)frame->GetHWND(), (HMENU)NULL, + (HWND)parent->GetHWND(), (HMENU)NULL, wxGetInstance(), NULL); if ( hwndTT ) { - frame->SetToolTipCtrl((WXHWND)hwndTT); + if ( frame ) + frame->SetToolTipCtrl((WXHWND)hwndTT); + else + dialog->SetToolTipCtrl((WXHWND)hwndTT); } else { @@ -112,22 +203,11 @@ WXHWND wxToolTip::GetToolTipCtrl() 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 +271,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