// 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;
}
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);
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);
}
// 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 )
// 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!
{
// Don't use DrawThemeBackground
}
- else if (!UseBgCol() && majorVersion >= 6)
+ else if ( !UseBgCol() && majorVersion >= 6 )
{
wxUxThemeEngine *theme = wxUxThemeEngine::GetIfActive();
if ( theme )
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);