+ // Next add the buttons and separators
+ // -----------------------------------
+
+ TBBUTTON *buttons = new TBBUTTON[nTools];
+
+ // this array will hold the indices of all controls in the toolbar
+ wxArrayInt controlIds;
+
+ bool lastWasRadio = false;
+ int i = 0;
+ for ( node = m_tools.GetFirst(); node; node = node->GetNext() )
+ {
+ wxToolBarToolBase *tool = node->GetData();
+
+ // don't add separators to the vertical toolbar with old comctl32.dll
+ // versions as they didn't handle this properly
+ if ( isVertical && tool->IsSeparator() &&
+ wxTheApp->GetComCtl32Version() <= 472 )
+ {
+ continue;
+ }
+
+
+ TBBUTTON& button = buttons[i];
+
+ wxZeroMemory(button);
+
+ bool isRadio = false;
+ switch ( tool->GetStyle() )
+ {
+ case wxTOOL_STYLE_CONTROL:
+ button.idCommand = tool->GetId();
+ // fall through: create just a separator too
+
+ case wxTOOL_STYLE_SEPARATOR:
+ button.fsState = TBSTATE_ENABLED;
+ button.fsStyle = TBSTYLE_SEP;
+ break;
+
+ case wxTOOL_STYLE_BUTTON:
+ if ( !HasFlag(wxTB_NOICONS) )
+ button.iBitmap = bitmapId;
+
+ if ( HasFlag(wxTB_TEXT) )
+ {
+ const wxString& label = tool->GetLabel();
+ if ( !label.empty() )
+ {
+ button.iString = (int)label.c_str();
+ }
+ }
+
+ button.idCommand = tool->GetId();
+
+ if ( tool->IsEnabled() )
+ button.fsState |= TBSTATE_ENABLED;
+ if ( tool->IsToggled() )
+ button.fsState |= TBSTATE_CHECKED;
+
+ switch ( tool->GetKind() )
+ {
+ case wxITEM_RADIO:
+ button.fsStyle = TBSTYLE_CHECKGROUP;
+
+ if ( !lastWasRadio )
+ {
+ // the first item in the radio group is checked by
+ // default to be consistent with wxGTK and the menu
+ // radio items
+ button.fsState |= TBSTATE_CHECKED;
+
+ tool->Toggle(true);
+ }
+
+ isRadio = true;
+ break;
+
+ case wxITEM_CHECK:
+ button.fsStyle = TBSTYLE_CHECK;
+ break;
+
+ default:
+ wxFAIL_MSG( _T("unexpected toolbar button kind") );
+ // fall through
+
+ case wxITEM_NORMAL:
+ button.fsStyle = TBSTYLE_BUTTON;
+ }
+
+ bitmapId++;
+ break;
+ }
+
+ lastWasRadio = isRadio;
+
+ i++;
+ }
+
+ if ( !::SendMessage(GetHwnd(), TB_ADDBUTTONS, (WPARAM)i, (LPARAM)buttons) )
+ {
+ wxLogLastError(wxT("TB_ADDBUTTONS"));
+ }
+
+ delete [] buttons;
+
+ // Deal with the controls finally
+ // ------------------------------
+
+ // adjust the controls size to fit nicely in the toolbar
+ int y = 0;
+ size_t index = 0;
+ for ( node = m_tools.GetFirst(); node; node = node->GetNext(), index++ )
+ {
+ wxToolBarToolBase *tool = 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 )
+ continue;
+
+ // note that we use TB_GETITEMRECT and not TB_GETRECT because the
+ // latter only appeared in v4.70 of comctl32.dll
+ RECT r;
+ if ( !::SendMessage(GetHwnd(), TB_GETITEMRECT,
+ index, (LPARAM)(LPRECT)&r) )
+ {
+ wxLogLastError(wxT("TB_GETITEMRECT"));
+ }