#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"
// 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;
}
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);
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) )
{
TBADDBITMAP addBitmap;
addBitmap.hInst = 0;
- addBitmap.nID = (UINT) hBitmap;
+ addBitmap.nID = (UINT_PTR)hBitmap;
if ( ::SendMessage(GetHwnd(), TB_ADDBITMAP,
(WPARAM) nButtons, (LPARAM)&addBitmap) == -1 )
{
{
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();
DoToggleTool(tool, true);
}
}
- else if (tool->IsToggled())
+ else if ( tool->IsToggled() )
{
wxToolBarToolsList::compatibility_iterator nodePrev = node->GetPrevious();
int prevIndex = i - 1;
if ( tool->Toggle(false) )
DoToggleTool(tool, false);
- prevButton.fsState = TBSTATE_ENABLED;
+ prevButton.fsState &= ~TBSTATE_CHECKED;
nodePrev = nodePrev->GetPrevious();
prevIndex--;
}
// 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;
// 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);
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;
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);
#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
//
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;
}
// 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) )
{