X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5625d0d4cae9261e1571220f883b7b6c9ddb01f8..79b7b95aed76eb742deef93d046886c20452fb36:/src/msw/tbar95.cpp diff --git a/src/msw/tbar95.cpp b/src/msw/tbar95.cpp index 606e581cd9..b12dd40b5f 100644 --- a/src/msw/tbar95.cpp +++ b/src/msw/tbar95.cpp @@ -26,7 +26,10 @@ #if wxUSE_TOOLBAR && wxUSE_TOOLBAR_NATIVE && !defined(__SMARTPHONE__) +#include "wx/toolbar.h" + #ifndef WX_PRECOMP + #include "wx/msw/wrapcctl.h" // include "properly" #include "wx/dynarray.h" #include "wx/frame.h" #include "wx/log.h" @@ -36,11 +39,11 @@ #include "wx/dcmemory.h" #include "wx/control.h" #include "wx/app.h" // for GetComCtl32Version + #include "wx/image.h" + #include "wx/stattext.h" #endif -#include "wx/toolbar.h" #include "wx/sysopt.h" -#include "wx/image.h" #include "wx/msw/private.h" @@ -48,9 +51,6 @@ #include "wx/msw/uxtheme.h" #endif -// include "properly" -#include "wx/msw/wrapcctl.h" - // this define controls whether the code for button colours remapping (only // useful for 16 or 256 colour images) is active at all, it's always turned off // for CE where it doesn't compile (and is probably not needed anyhow) and may @@ -149,14 +149,38 @@ public: clientData, shortHelp, longHelp) { m_nSepCount = 0; + m_staticText = 0; } - wxToolBarTool(wxToolBar *tbar, wxControl *control) - : wxToolBarToolBase(tbar, control) + wxToolBarTool(wxToolBar *tbar, wxControl *control, const wxString& label) + : wxToolBarToolBase(tbar, control, label) { + if ( IsControl() && !m_label.empty() ) + { + // create a control to render the control's label + m_staticText = new wxStaticText + ( + m_tbar, + wxID_ANY, + m_label, + wxDefaultPosition, + wxDefaultSize, + wxALIGN_CENTRE | wxST_NO_AUTORESIZE + ); + } + else // no label + { + m_staticText = NULL; + } + m_nSepCount = 1; } + virtual ~wxToolBarTool() + { + delete m_staticText; + } + virtual void SetLabel(const wxString& label) { if ( label == m_label ) @@ -164,12 +188,23 @@ public: wxToolBarToolBase::SetLabel(label); + if ( m_staticText ) + m_staticText->SetLabel(label); + // we need to update the label shown in the toolbar because it has a // pointer to the internal buffer of the old label // // TODO: use TB_SETBUTTONINFO } + wxStaticText* GetStaticText() + { + wxASSERT_MSG( IsControl(), + _T("only makes sense for embedded control tools") ); + + return m_staticText; + } + // set/get the number of separators which we use to cover the space used by // a control in the toolbar void SetSeparatorsCount(size_t count) { m_nSepCount = count; } @@ -177,11 +212,11 @@ public: private: size_t m_nSepCount; + wxStaticText *m_staticText; DECLARE_NO_COPY_CLASS(wxToolBarTool) }; - // ============================================================================ // implementation // ============================================================================ @@ -203,9 +238,10 @@ wxToolBarToolBase *wxToolBar::CreateTool(int id, clientData, shortHelp, longHelp); } -wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control) +wxToolBarToolBase * +wxToolBar::CreateTool(wxControl *control, const wxString& label) { - return new wxToolBarTool(this, control); + return new wxToolBarTool(this, control, label); } // ---------------------------------------------------------------------------- @@ -222,7 +258,7 @@ void wxToolBar::Init() m_defaultWidth = DEFAULTBITMAPX; m_defaultHeight = DEFAULTBITMAPY; - m_pInTool = 0; + m_pInTool = NULL; } bool wxToolBar::Create(wxWindow *parent, @@ -236,6 +272,8 @@ bool wxToolBar::Create(wxWindow *parent, if ( !CreateControl(parent, id, pos, size, style, wxDefaultValidator, name) ) return false; + FixupStyle(); + // MSW-specific initialisation if ( !MSWCreateToolbar(pos, size) ) return false; @@ -247,7 +285,7 @@ bool wxToolBar::Create(wxWindow *parent, #if wxUSE_UXTHEME if ( style & wxTB_FLAT ) { - LRESULT style = ::SendMessage(GetHwnd(), TB_GETSTYLE, 0, 0L); + LRESULT style = GetMSWToolbarStyle(); if ( !(style & TBSTYLE_FLAT) ) ::SendMessage(GetHwnd(), TB_SETSTYLE, 0, style | TBSTYLE_FLAT); @@ -265,6 +303,18 @@ bool wxToolBar::MSWCreateToolbar(const wxPoint& pos, const wxSize& size) // toolbar-specific post initialisation ::SendMessage(GetHwnd(), TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0); +#ifdef TB_SETEXTENDEDSTYLE + if ( wxApp::GetComCtl32Version() >= 471 ) + ::SendMessage(GetHwnd(), TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_DRAWDDARROWS); +#endif + + // Fix a bug on e.g. the Silver theme on WinXP where control backgrounds + // are incorrectly drawn, by forcing the background to a specific colour. + int majorVersion, minorVersion; + wxGetOsVersion(& majorVersion, & minorVersion); + if (majorVersion < 6) + SetBackgroundColour(GetBackgroundColour()); + return true; } @@ -349,7 +399,7 @@ wxSize wxToolBar::DoGetBestSize() const sizeBest.x *= GetToolsCount(); // reverse horz and vertical components if necessary - if ( HasFlag(wxTB_VERTICAL) ) + if ( IsVertical() ) { int t = sizeBest.x; sizeBest.x = sizeBest.y; @@ -362,6 +412,17 @@ wxSize wxToolBar::DoGetBestSize() const sizeBest.y = size.cy; } + if (!IsVertical()) + { + // Without the extra height, DoGetBestSize can report a size that's + // smaller than the actual window, causing windows to overlap slightly + // in some circumstances, leading to missing borders (especially noticeable + // in AUI layouts). + if (!(GetWindowStyle() & wxTB_NODIVIDER)) + sizeBest.y += 2; + sizeBest.y ++; + } + CacheBestSize(sizeBest); return sizeBest; @@ -376,14 +437,13 @@ WXDWORD wxToolBar::MSWGetStyle(long style, WXDWORD *exstyle) const (style & ~wxBORDER_MASK) | wxBORDER_NONE, exstyle ); - // always include this one, it never hurts and setting it later - // only if we do have tooltips wouldn't work - msStyle |= TBSTYLE_TOOLTIPS; + if ( !(style & wxTB_NO_TOOLTIPS) ) + msStyle |= TBSTYLE_TOOLTIPS; if ( style & (wxTB_FLAT | wxTB_HORZ_LAYOUT) ) { // static as it doesn't change during the program lifetime - static int s_verComCtl = wxApp::GetComCtl32Version(); + static const int s_verComCtl = wxApp::GetComCtl32Version(); // comctl32.dll 4.00 doesn't support the flat toolbars and using this // style with 6.00 (part of Windows XP) leads to the toolbar with @@ -405,6 +465,12 @@ WXDWORD wxToolBar::MSWGetStyle(long style, WXDWORD *exstyle) const if ( style & wxTB_VERTICAL ) msStyle |= CCS_VERT; + if( style & wxTB_BOTTOM ) + msStyle |= CCS_BOTTOM; + + if ( style & wxTB_RIGHT ) + msStyle |= CCS_RIGHT; + return msStyle; } @@ -484,13 +550,16 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool) // takes care of all normal items) for ( /* node -> first after deleted */ ; node; node = node->GetNext() ) { - wxToolBarToolBase *tool2 = node->GetData(); + wxToolBarTool *tool2 = (wxToolBarTool*)node->GetData(); if ( tool2->IsControl() ) { int x; wxControl *control = tool2->GetControl(); control->GetPosition(&x, NULL); control->Move(x - width, wxDefaultCoord); + + wxStaticText* staticText = tool2->GetStaticText(); + staticText->Move(x - width, wxDefaultCoord); } } @@ -541,8 +610,6 @@ bool wxToolBar::Realize() // nothing to do return true; - const bool isVertical = HasFlag(wxTB_VERTICAL); - #ifdef wxREMAP_BUTTON_COLOURS // don't change the values of these constants, they can be set from the // user code via wxSystemOptions @@ -677,8 +744,8 @@ bool wxToolBar::Realize() // no disabled bitmap specified but we still need to // fill the space in the image list with something, so // we grey out the normal bitmap - wxImage imgGreyed; - wxCreateGreyedImage(bmp.ConvertToImage(), imgGreyed); + wxImage + imgGreyed = bmp.ConvertToImage().ConvertToGreyscale(); #ifdef wxREMAP_BUTTON_COLOURS if ( remapValue == Remap_Buttons ) @@ -781,17 +848,21 @@ bool wxToolBar::Realize() } } - if ( m_disabledImgList ) + // disable image lists are only supported in comctl32.dll 4.70+ + if ( wxApp::GetComCtl32Version() >= 470 ) { + HIMAGELIST hil = m_disabledImgList + ? GetHimagelistOf(m_disabledImgList) + : 0; + + // notice that we set the image list even if don't have one right + // now as we could have it before and need to reset it in this case HIMAGELIST oldImageList = (HIMAGELIST) - ::SendMessage(GetHwnd(), - TB_SETDISABLEDIMAGELIST, - 0, - (LPARAM)GetHimagelistOf(m_disabledImgList)); + ::SendMessage(GetHwnd(), TB_SETDISABLEDIMAGELIST, 0, (LPARAM)hil); // delete previous image list if any if ( oldImageList ) - ::DeleteObject( oldImageList ); + ::DeleteObject(oldImageList); } } @@ -819,7 +890,7 @@ bool wxToolBar::Realize() // don't add separators to the vertical toolbar with old comctl32.dll // versions as they didn't handle this properly - if ( isVertical && tool->IsSeparator() && + if ( IsVertical() && tool->IsSeparator() && wxApp::GetComCtl32Version() <= 472 ) { continue; @@ -849,7 +920,7 @@ bool wxToolBar::Realize() { const wxString& label = tool->GetLabel(); if ( !label.empty() ) - button.iString = (int)label.c_str(); + button.iString = (int)label.wx_str(); } button.idCommand = tool->GetId(); @@ -876,7 +947,7 @@ bool wxToolBar::Realize() DoToggleTool(tool, true); } } - else if (tool->IsToggled()) + else if ( tool->IsToggled() ) { wxToolBarToolsList::compatibility_iterator nodePrev = node->GetPrevious(); int prevIndex = i - 1; @@ -890,7 +961,7 @@ bool wxToolBar::Realize() if ( tool->Toggle(false) ) DoToggleTool(tool, false); - prevButton.fsState = TBSTATE_ENABLED; + prevButton.fsState &= ~TBSTATE_CHECKED; nodePrev = nodePrev->GetPrevious(); prevIndex--; } @@ -907,6 +978,10 @@ bool wxToolBar::Realize() button.fsStyle = TBSTYLE_BUTTON; break; + case wxITEM_DROPDOWN: + button.fsStyle = TBSTYLE_DROPDOWN; + break; + default: wxFAIL_MSG( _T("unexpected toolbar button kind") ); button.fsStyle = TBSTYLE_BUTTON; @@ -937,13 +1012,13 @@ bool wxToolBar::Realize() size_t index = 0; for ( node = m_tools.GetFirst(); node; node = node->GetNext(), index++ ) { - wxToolBarToolBase *tool = node->GetData(); + wxToolBarTool *tool = (wxToolBarTool*)node->GetData(); // we calculate the running y coord for vertical toolbars so we need to // get the items size for all items but for the horizontal ones we // don't need to deal with the non controls bool isControl = tool->IsControl(); - if ( !isControl && !isVertical ) + if ( !isControl && !IsVertical() ) continue; // note that we use TB_GETITEMRECT and not TB_GETRECT because the @@ -964,7 +1039,15 @@ bool wxToolBar::Realize() } wxControl *control = tool->GetControl(); + wxStaticText * const staticText = tool->GetStaticText(); + wxSize size = control->GetSize(); + wxSize staticTextSize; + if ( staticText ) + { + staticTextSize = staticText->GetSize(); + staticTextSize.y += 3; // margin between control and its label + } // the position of the leftmost controls corner int left = wxDefaultCoord; @@ -1019,22 +1102,40 @@ bool wxToolBar::Realize() ((wxToolBarTool *)tool)->SetSeparatorsCount(nSeparators); // adjust the controls width to exactly cover the separators - control->SetSize((nSeparators + 1)*widthSep, wxDefaultCoord); + size.x = (nSeparators + 1)*widthSep; + control->SetSize(size.x, wxDefaultCoord); } - // position the control itself correctly vertically - int height = r.bottom - r.top; + // position the control itself correctly vertically centering it on the + // icon area of the toolbar + int height = r.bottom - r.top - staticTextSize.y; + int diff = height - size.y; - if ( diff < 0 ) + if ( diff < 0 || !HasFlag(wxTB_TEXT) ) { - // the control is too high, resize to fit - control->SetSize(wxDefaultCoord, height - 2); + // not enough room for the static text + if ( staticText ) + staticText->Hide(); + + // recalculate height & diff without the staticText control + height = r.bottom - r.top; + diff = height - size.y; + if ( diff < 0 ) + { + // the control is too high, resize to fit + control->SetSize(wxDefaultCoord, height - 2); - diff = 2; + diff = 2; + } + } + else // enough space for both the control and the label + { + if ( staticText ) + staticText->Show(); } int top; - if ( isVertical ) + if ( IsVertical() ) { left = 0; top = y; @@ -1050,13 +1151,18 @@ bool wxToolBar::Realize() } control->Move(left, top + (diff + 1) / 2); + if ( staticText ) + { + staticText->Move(left + (size.x - staticTextSize.x)/2, + r.bottom - staticTextSize.y); + } } // the max index is the "real" number of buttons - i.e. counting even the // separators which we added just for aligning the controls m_nButtons = index; - if ( !isVertical ) + if ( !IsVertical() ) { if ( m_maxRows == 0 ) // if not set yet, only one row @@ -1064,9 +1170,9 @@ bool wxToolBar::Realize() } else if ( m_nButtons > 0 ) // vertical non empty toolbar { - if ( m_maxRows == 0 ) - // if not set yet, have one column - SetRows(m_nButtons); + // if not set yet, have one column + m_maxRows = 1; + SetRows(m_nButtons); } InvalidateBestSize(); @@ -1079,9 +1185,14 @@ bool wxToolBar::Realize() // message handlers // ---------------------------------------------------------------------------- -bool wxToolBar::MSWCommand(WXUINT WXUNUSED(cmd), WXWORD id) +bool wxToolBar::MSWCommand(WXUINT WXUNUSED(cmd), WXWORD id_) { - wxToolBarToolBase *tool = FindById((int)id); + // cast to signed is important as we compare this id with (signed) ints in + // FindById() and without the cast we'd get a positive int from a + // "negative" (i.e. > 32767) WORD + const int id = (signed short)id_; + + wxToolBarToolBase *tool = FindById(id); if ( !tool ) return false; @@ -1103,7 +1214,7 @@ bool wxToolBar::MSWCommand(WXUINT WXUNUSED(cmd), WXWORD id) // OnLeftClick() can veto the button state change - for buttons which // may be toggled only, of couse - if ( !OnLeftClick((int)id, toggled) && tool->CanBeToggled() ) + if ( !OnLeftClick(id, toggled) && tool->CanBeToggled() ) { // revert back tool->Toggle(!toggled); @@ -1118,33 +1229,61 @@ bool wxToolBar::MSWOnNotify(int WXUNUSED(idCtrl), WXLPARAM lParam, WXLPARAM *WXUNUSED(result)) { -#if wxUSE_TOOLTIPS - // First check if this applies to us - NMHDR *hdr = (NMHDR *)lParam; + LPNMHDR hdr = (LPNMHDR)lParam; + if ( hdr->code == TBN_DROPDOWN ) + { + LPNMTOOLBAR tbhdr = (LPNMTOOLBAR)lParam; - // the tooltips control created by the toolbar is sometimes Unicode, even - // in an ANSI application - this seems to be a bug in comctl32.dll v5 - UINT code = hdr->code; - if ( (code != (UINT) TTN_NEEDTEXTA) && (code != (UINT) TTN_NEEDTEXTW) ) - return false; + wxCommandEvent evt(wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED, tbhdr->iItem); + if ( GetEventHandler()->ProcessEvent(evt) ) + { + // Event got handled, don't display default popup menu + return false; + } - HWND toolTipWnd = (HWND)::SendMessage((HWND)GetHWND(), TB_GETTOOLTIPS, 0, 0); - if ( toolTipWnd != hdr->hwndFrom ) - return false; + const wxToolBarToolBase * const tool = FindById(tbhdr->iItem); + wxCHECK_MSG( tool, false, _T("drop down message for unknown tool") ); - LPTOOLTIPTEXT ttText = (LPTOOLTIPTEXT)lParam; - int id = (int)ttText->hdr.idFrom; + wxMenu * const menu = tool->GetDropdownMenu(); + if ( !menu ) + return false; - wxToolBarToolBase *tool = FindById(id); - if ( !tool ) - return false; + // Display popup menu below button + RECT r; + if (::SendMessage(GetHwnd(), TB_GETITEMRECT, GetToolPos(tbhdr->iItem), (LPARAM)&r)) + PopupMenu(menu, r.left, r.bottom); + + return true; + } + + + if( !HasFlag(wxTB_NO_TOOLTIPS) ) + { +#if wxUSE_TOOLTIPS + // First check if this applies to us - return HandleTooltipNotify(code, lParam, tool->GetShortHelp()); + // the tooltips control created by the toolbar is sometimes Unicode, even + // in an ANSI application - this seems to be a bug in comctl32.dll v5 + UINT code = hdr->code; + if ( (code != (UINT) TTN_NEEDTEXTA) && (code != (UINT) TTN_NEEDTEXTW) ) + return false; + + HWND toolTipWnd = (HWND)::SendMessage(GetHwnd(), TB_GETTOOLTIPS, 0, 0); + if ( toolTipWnd != hdr->hwndFrom ) + return false; + + LPTOOLTIPTEXT ttText = (LPTOOLTIPTEXT)lParam; + int id = (int)ttText->hdr.idFrom; + + wxToolBarToolBase *tool = FindById(id); + if ( tool ) + return HandleTooltipNotify(code, lParam, tool->GetShortHelp()); #else - wxUnusedVar(lParam); + wxUnusedVar(lParam); +#endif + } return false; -#endif } // ---------------------------------------------------------------------------- @@ -1272,6 +1411,12 @@ void wxToolBar::UpdateSize() // toolbar styles // --------------------------------------------------------------------------- +// get the TBSTYLE of the given toolbar window +long wxToolBar::GetMSWToolbarStyle() const +{ + return ::SendMessage(GetHwnd(), TB_GETSTYLE, 0, 0L); +} + void wxToolBar::SetWindowStyleFlag(long style) { // the style bits whose changes force us to recreate the toolbar @@ -1317,6 +1462,30 @@ void wxToolBar::DoSetToggle(wxToolBarToolBase *WXUNUSED(tool), bool WXUNUSED(tog wxFAIL_MSG( _T("not implemented") ); } +void wxToolBar::SetToolNormalBitmap( int id, const wxBitmap& bitmap ) +{ + wxToolBarTool* tool = wx_static_cast(wxToolBarTool*, FindById(id)); + if ( tool ) + { + wxCHECK_RET( tool->IsButton(), wxT("Can only set bitmap on button tools.")); + + tool->SetNormalBitmap(bitmap); + Realize(); + } +} + +void wxToolBar::SetToolDisabledBitmap( int id, const wxBitmap& bitmap ) +{ + wxToolBarTool* tool = wx_static_cast(wxToolBarTool*, FindById(id)); + if ( tool ) + { + wxCHECK_RET( tool->IsButton(), wxT("Can only set bitmap on button tools.")); + + tool->SetDisabledBitmap(bitmap); + Realize(); + } +} + // ---------------------------------------------------------------------------- // event handlers // ---------------------------------------------------------------------------- @@ -1342,9 +1511,14 @@ void wxToolBar::OnSysColourChanged(wxSysColourChangedEvent& event) void wxToolBar::OnMouseEvent(wxMouseEvent& event) { - if (event.Leaving() && m_pInTool) + if ( event.Leaving() ) { - OnMouseEnter( -1 ); + if ( m_pInTool ) + { + OnMouseEnter(wxID_ANY); + m_pInTool = NULL; + } + event.Skip(); return; } @@ -1371,7 +1545,56 @@ void wxToolBar::OnEraseBackground(wxEraseEvent& event) RECT rect = wxGetClientRect(GetHwnd()); HDC hdc = GetHdcOf((*event.GetDC())); - if ( UseBgCol() ) + int majorVersion, minorVersion; + wxGetOsVersion(& majorVersion, & minorVersion); + +#if wxUSE_UXTHEME + // we may need to draw themed colour so that we appear correctly on + // e.g. notebook page under XP with themes but only do it if the parent + // draws themed background itself + if ( !UseBgCol() && !GetParent()->UseBgCol() ) + { + wxUxThemeEngine *theme = wxUxThemeEngine::GetIfActive(); + if ( theme ) + { + HRESULT + hr = theme->DrawThemeParentBackground(GetHwnd(), hdc, &rect); + if ( hr == S_OK ) + return; + + // it can also return S_FALSE which seems to simply say that it + // didn't draw anything but no error really occurred + if ( FAILED(hr) ) + wxLogApiError(_T("DrawThemeParentBackground(toolbar)"), hr); + } + } + + // Only draw a rebar theme on Vista, since it doesn't jive so well with XP + if ( !UseBgCol() && majorVersion >= 6 ) + { + wxUxThemeEngine *theme = wxUxThemeEngine::GetIfActive(); + if ( theme ) + { + wxUxThemeHandle hTheme(this, L"REBAR"); + + RECT r; + wxRect rect = GetClientRect(); + wxCopyRectToRECT(rect, r); + + HRESULT hr = theme->DrawThemeBackground(hTheme, hdc, 0, 0, & r, NULL); + if ( hr == S_OK ) + return; + + // it can also return S_FALSE which seems to simply say that it + // didn't draw anything but no error really occurred + if ( FAILED(hr) ) + wxLogApiError(_T("DrawThemeParentBackground(toolbar)"), hr); + } + } + +#endif // wxUSE_UXTHEME + + if ( UseBgCol() || (GetMSWToolbarStyle() & TBSTYLE_TRANSPARENT) ) { // do draw our background // @@ -1385,30 +1608,8 @@ void wxToolBar::OnEraseBackground(wxEraseEvent& event) } else // we have no non default background colour { -#if wxUSE_UXTHEME - // we may need to draw themed colour so that we appear correctly on - // e.g. notebook page under XP with themes but only do it if the parent - // draws themed background itself - if ( !GetParent()->UseBgCol() ) - { - wxUxThemeEngine *theme = wxUxThemeEngine::GetIfActive(); - if ( theme ) - { - HRESULT - hr = theme->DrawThemeParentBackground(GetHwnd(), hdc, &rect); - if ( hr == S_OK ) - return; - - // it can also return S_FALSE which seems to simply say that it - // didn't draw anything but no error really occurred - if ( FAILED(hr) ) - wxLogApiError(_T("DrawThemeParentBackground(toolbar)"), hr); - } - } -#endif // wxUSE_UXTHEME - + // let the system do it for us event.Skip(); - return; } } @@ -1421,7 +1622,7 @@ bool wxToolBar::HandleSize(WXWPARAM WXUNUSED(wParam), WXLPARAM lParam) { int w, h; - if ( GetWindowStyle() & wxTB_VERTICAL ) + if ( IsVertical() ) { w = r.right - r.left; if ( m_maxRows ) @@ -1475,6 +1676,10 @@ bool wxToolBar::HandlePaint(WXWPARAM wParam, WXLPARAM lParam) // no controls, nothing to erase return false; + wxSize clientSize = GetClientSize(); + int majorVersion, minorVersion; + wxGetOsVersion(& majorVersion, & minorVersion); + // prepare the DC on which we'll be drawing wxClientDC dc(this); dc.SetBrush(wxBrush(GetBackgroundColour(), wxSOLID)); @@ -1501,12 +1706,18 @@ bool wxToolBar::HandlePaint(WXWPARAM wParam, WXLPARAM lParam) // otherwise for ( node = m_tools.GetFirst(); node; node = node->GetNext() ) { - wxToolBarToolBase *tool = node->GetData(); + wxToolBarTool *tool = (wxToolBarTool*)node->GetData(); if ( tool->IsControl() ) { // get the control rect in our client coords wxControl *control = tool->GetControl(); + wxStaticText *staticText = tool->GetStaticText(); wxRect rectCtrl = control->GetRect(); + wxRect rectStaticText(0,0,0,0); + if ( staticText ) + { + rectStaticText = staticText->GetRect(); + } // iterate over all buttons TBBUTTON tbb; @@ -1538,15 +1749,57 @@ bool wxToolBar::HandlePaint(WXWPARAM wParam, WXLPARAM lParam) // does it intersect the control? wxRect rectItem; wxCopyRECTToRect(r, rectItem); - if ( rectCtrl.Intersects(rectItem) ) + if ( rectCtrl.Intersects(rectItem) || (staticText && rectStaticText.Intersects(rectItem))) { // yes, do erase it! - dc.DrawRectangle(rectItem); + bool haveRefreshed = false; + +#if wxUSE_UXTHEME + if ( !UseBgCol() && !GetParent()->UseBgCol() ) + { + // Don't use DrawThemeBackground + } + else if ( !UseBgCol() && majorVersion >= 6 ) + { + wxUxThemeEngine *theme = wxUxThemeEngine::GetIfActive(); + if ( theme ) + { + wxUxThemeHandle hTheme(this, L"REBAR"); + + RECT clipRect = r; + + // Draw the whole background since the pattern may be position sensitive; + // but clip it to the area of interest. + r.left = 0; + r.right = clientSize.x; + r.top = 0; + r.bottom = clientSize.y; + + HRESULT hr = theme->DrawThemeBackground(hTheme, (HDC) dc.GetHDC(), 0, 0, & r, & clipRect); + if ( hr == S_OK ) + haveRefreshed = true; + } + } +#endif + + if (!haveRefreshed) + dc.DrawRectangle(rectItem); + } + + if ( rectCtrl.Intersects(rectItem) ) + { // Necessary in case we use a no-paint-on-size // style in the parent: the controls can disappear control->Refresh(false); } + + if ( staticText && rectStaticText.Intersects(rectItem) ) + { + // Necessary in case we use a no-paint-on-size + // style in the parent: the controls can disappear + staticText->Refresh(false); + } } } } @@ -1560,18 +1813,11 @@ void wxToolBar::HandleMouseMove(WXWPARAM WXUNUSED(wParam), WXLPARAM lParam) y = GET_Y_LPARAM(lParam); wxToolBarToolBase* tool = FindToolForPosition( x, y ); - // cursor left current tool - if ( tool != m_pInTool && !tool ) - { - m_pInTool = 0; - OnMouseEnter( -1 ); - } - - // cursor entered a tool - if ( tool != m_pInTool && tool ) + // has the current tool changed? + if ( tool != m_pInTool ) { m_pInTool = tool; - OnMouseEnter( tool->GetId() ); + OnMouseEnter(tool ? tool->GetId() : wxID_ANY); } }