BEGIN_EVENT_TABLE(wxToolBar, wxToolBarBase)
EVT_MOUSE_EVENTS(wxToolBar::OnMouseEvent)
EVT_SYS_COLOUR_CHANGED(wxToolBar::OnSysColourChanged)
+ EVT_ERASE_BACKGROUND(wxToolBar::OnEraseBackground)
END_EVENT_TABLE()
// ----------------------------------------------------------------------------
// in WM_ERASEBKGND too (by default this won't be done but if the toolbar
// has a non default background colour, then it would be used in both
// places resulting in flicker)
- SetBackgroundStyle(wxBG_STYLE_PAINT);
+ if (wxApp::GetComCtl32Version() >= 600)
+ {
+ SetBackgroundStyle(wxBG_STYLE_PAINT);
+ }
return true;
}
// get the size of the button we're going to delete
const RECT r = wxGetTBItemRect(GetHwnd(), pos);
- int width = r.right - r.left;
+ int delta = IsVertical() ? r.bottom - r.top : r.right - r.left;
if ( tool->IsControl() )
{
nButtonsToDelete = ((wxToolBarTool *)tool)->GetSeparatorsCount();
- width *= nButtonsToDelete;
+
+ if ( !IsVertical() )
+ delta *= nButtonsToDelete;
}
+ m_totalFixedSize -= delta;
+
// do delete all buttons
m_nButtons -= nButtonsToDelete;
while ( nButtonsToDelete-- > 0 )
}
}
- // and finally reposition all the controls after this button (the toolbar
- // takes care of all normal items)
- for ( /* node -> first after deleted */ ; node; node = node->GetNext() )
+ // and finally rearrange the tools
+
+ // search for any stretch spacers before the removed tool
+ bool hasPrecedingStrechables = false;
+ for ( wxToolBarToolsList::compatibility_iterator nodeStch = m_tools.GetFirst();
+ nodeStch != node; nodeStch = nodeStch->GetNext() )
{
- wxToolBarTool *tool2 = (wxToolBarTool*)node->GetData();
- if ( tool2->IsControl() )
+ if ( ((wxToolBarTool*)nodeStch->GetData())->IsStretchable() )
+ {
+ hasPrecedingStrechables = true;
+ break;
+ }
+ }
+
+ if ( hasPrecedingStrechables )
+ {
+ // if the removed tool is preceded by stretch spacers
+ // just redistribute the space
+ UpdateStretchableSpacersSize();
+ }
+ else
+ {
+ // reposition all the controls after this button but before any
+ // stretch spacer (the toolbar takes care of all normal items)
+ for ( /* node -> first after deleted */ ; node; node = node->GetNext() )
{
- tool2->MoveBy(-width);
+ wxToolBarTool *tool2 = (wxToolBarTool*)node->GetData();
+
+ if ( tool2->IsControl() )
+ {
+ tool2->MoveBy(-delta);
+ }
+
+ // if a stretch spacer is found just redistribute the available space
+ else if ( tool2->IsStretchable() )
+ {
+ UpdateStretchableSpacersSize();
+ break;
+ }
}
}
{
const wxString& label = tool->GetLabel();
if ( !label.empty() )
- button.iString = (INT_PTR)label.wx_str();
+ button.iString = (INT_PTR) wxMSW_CONV_LPCTSTR(label);
}
button.idCommand = tool->GetId();
break;
}
+ // Instead of using fixed widths for all buttons, size them
+ // automatically according to the size of their bitmap and text
+ // label, if present. This particularly matters for toolbars
+ // with the wxTB_HORZ_LAYOUT style: they look hideously ugly
+ // without autosizing when the labels have even slightly
+ // different lengths.
+ button.fsStyle |= TBSTYLE_AUTOSIZE;
+
bitmapId++;
break;
}
{
LPNMTOOLBAR tbhdr = (LPNMTOOLBAR)lParam;
- wxCommandEvent evt(wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED, tbhdr->iItem);
+ wxCommandEvent evt(wxEVT_TOOL_DROPDOWN, tbhdr->iItem);
if ( HandleWindowEvent(evt) )
{
// Event got handled, don't display default popup menu
}
}
+// This handler is needed to fix problems with painting the background of
+// toolbar icons with comctl32.dll < 6.0.
+void wxToolBar::OnEraseBackground(wxEraseEvent& event)
+{
+#ifdef wxHAS_MSW_BACKGROUND_ERASE_HOOK
+ MSWDoEraseBackground(event.GetDC()->GetHDC());
+#endif // wxHAS_MSW_BACKGROUND_ERASE_HOOK
+}
+
bool wxToolBar::HandleSize(WXWPARAM WXUNUSED(wParam), WXLPARAM lParam)
{
// wait until we have some tools