X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/99be3b7c7ccfdd5ad097739482f86e2e096edd77..dd9f8b6bb6935360a8271dc3e8749fb026b601a8:/src/msw/tbar95.cpp?ds=sidebyside diff --git a/src/msw/tbar95.cpp b/src/msw/tbar95.cpp index b766b3f2bc..16ebe1ffc1 100644 --- a/src/msw/tbar95.cpp +++ b/src/msw/tbar95.cpp @@ -44,8 +44,10 @@ #endif #include "wx/sysopt.h" +#include "wx/dcclient.h" #include "wx/msw/private.h" +#include "wx/msw/dc.h" #if wxUSE_UXTHEME #include "wx/msw/uxtheme.h" @@ -303,8 +305,10 @@ 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 return true; } @@ -403,8 +407,16 @@ wxSize wxToolBar::DoGetBestSize() const sizeBest.y = size.cy; } - if (!IsVertical() && !(GetWindowStyle() & wxTB_NODIVIDER)) - sizeBest.y += 1; + 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); @@ -793,8 +805,8 @@ bool wxToolBar::Realize() TBREPLACEBITMAP replaceBitmap; replaceBitmap.hInstOld = NULL; replaceBitmap.hInstNew = NULL; - replaceBitmap.nIDOld = (UINT) oldToolBarBitmap; - replaceBitmap.nIDNew = (UINT) hBitmap; + replaceBitmap.nIDOld = (UINT_PTR)oldToolBarBitmap; + replaceBitmap.nIDNew = (UINT_PTR)hBitmap; replaceBitmap.nButtons = nButtons; if ( !::SendMessage(GetHwnd(), TB_REPLACEBITMAP, 0, (LPARAM) &replaceBitmap) ) @@ -823,7 +835,7 @@ bool wxToolBar::Realize() { TBADDBITMAP addBitmap; addBitmap.hInst = 0; - addBitmap.nID = (UINT) hBitmap; + addBitmap.nID = (UINT_PTR)hBitmap; if ( ::SendMessage(GetHwnd(), TB_ADDBITMAP, (WPARAM) nButtons, (LPARAM)&addBitmap) == -1 ) { @@ -903,7 +915,7 @@ bool wxToolBar::Realize() { const wxString& label = tool->GetLabel(); if ( !label.empty() ) - button.iString = (int)label.wx_str(); + button.iString = (INT_PTR)label.wx_str(); } button.idCommand = tool->GetId(); @@ -930,7 +942,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; @@ -944,7 +956,7 @@ bool wxToolBar::Realize() if ( tool->Toggle(false) ) DoToggleTool(tool, false); - prevButton.fsState = TBSTATE_ENABLED; + prevButton.fsState &= ~TBSTATE_CHECKED; nodePrev = nodePrev->GetPrevious(); prevIndex--; } @@ -1168,9 +1180,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; @@ -1192,7 +1209,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); @@ -1213,7 +1230,7 @@ bool wxToolBar::MSWOnNotify(int WXUNUSED(idCtrl), LPNMTOOLBAR tbhdr = (LPNMTOOLBAR)lParam; wxCommandEvent evt(wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED, tbhdr->iItem); - if ( GetEventHandler()->ProcessEvent(evt) ) + if ( HandleWindowEvent(evt) ) { // Event got handled, don't display default popup menu return false; @@ -1521,7 +1538,11 @@ void wxToolBar::OnMouseEvent(wxMouseEvent& event) void wxToolBar::OnEraseBackground(wxEraseEvent& event) { RECT rect = wxGetClientRect(GetHwnd()); - HDC hdc = GetHdcOf((*event.GetDC())); + + wxDC *dc = event.GetDC(); + if (!dc) return; + wxMSWDCImpl *impl = (wxMSWDCImpl*) dc->GetImpl(); + HDC hdc = GetHdcOf(*impl); int majorVersion, minorVersion; wxGetOsVersion(& majorVersion, & minorVersion); @@ -1548,7 +1569,7 @@ void wxToolBar::OnEraseBackground(wxEraseEvent& event) } // Only draw a rebar theme on Vista, since it doesn't jive so well with XP - if ( !UseBgCol() && majorVersion >= 6) + if ( !UseBgCol() && majorVersion >= 6 ) { wxUxThemeEngine *theme = wxUxThemeEngine::GetIfActive(); if ( theme ) @@ -1572,7 +1593,10 @@ void wxToolBar::OnEraseBackground(wxEraseEvent& event) #endif // wxUSE_UXTHEME - if ( UseBgCol() || (GetMSWToolbarStyle() & TBSTYLE_TRANSPARENT) ) + // we need to always draw our background under XP, as otherwise it doesn't + // appear correctly with some themes (e.g. Zune one) + if ( majorVersion == 5 || + UseBgCol() || (GetMSWToolbarStyle() & TBSTYLE_TRANSPARENT) ) { // do draw our background // @@ -1727,16 +1751,7 @@ bool wxToolBar::HandlePaint(WXWPARAM wParam, WXLPARAM lParam) // does it intersect the control? wxRect rectItem; wxCopyRECTToRect(r, rectItem); - if ( rectCtrl.Intersects(rectItem) ) - { - // yes, do erase it! - dc.DrawRectangle(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) ) + if ( rectCtrl.Intersects(rectItem) || (staticText && rectStaticText.Intersects(rectItem))) { // yes, do erase it! @@ -1747,7 +1762,7 @@ bool wxToolBar::HandlePaint(WXWPARAM wParam, WXLPARAM lParam) { // Don't use DrawThemeBackground } - else if (!UseBgCol() && majorVersion >= 6) + else if ( !UseBgCol() && majorVersion >= 6 ) { wxUxThemeEngine *theme = wxUxThemeEngine::GetIfActive(); if ( theme ) @@ -1762,8 +1777,9 @@ bool wxToolBar::HandlePaint(WXWPARAM wParam, WXLPARAM lParam) r.right = clientSize.x; r.top = 0; r.bottom = clientSize.y; - - HRESULT hr = theme->DrawThemeBackground(hTheme, (HDC) dc.GetHDC(), 0, 0, & r, & clipRect); + + wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl(); + HRESULT hr = theme->DrawThemeBackground(hTheme, GetHdcOf(*impl), 0, 0, & r, & clipRect); if ( hr == S_OK ) haveRefreshed = true; } @@ -1772,7 +1788,17 @@ bool wxToolBar::HandlePaint(WXWPARAM wParam, WXLPARAM lParam) 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);