of a "separator" is a vertical line under Windows95 vs. simple space under GTK etc.
{\bf wxToolBar95:} Note that this toolbar paints tools to reflect user-selected colours.
-The toolbar orientation must always be {\bf wxHORIZONTAL}.
-
-{\bf wxToolBarGtk:} The toolbar orientation is ignored and is always {\bf wxHORIZONTAL}.
\wxheading{Window styles}
\twocolitem{\windowstyle{wxTB\_NOICONS}}{Doesn't show the icons in the toolbar buttons, by default they are shown}
\end{twocollist}
-See also \helpref{window styles overview}{windowstyles}.
+See also \helpref{window styles overview}{windowstyles}. Note that the Win32
+native toolbar ignores {\tt wxTB\_NOICONS} style. Also, toggling the
+{\tt wxTB\_TEXT} works only if the style was initially on.
\wxheading{Event handling}
const int ID_TOOLBAR = 500;
-static const long TOOLBAR_STYLE = wxNO_BORDER | wxTB_FLAT | wxTB_DOCKABLE;
+static const long TOOLBAR_STYLE = wxTB_FLAT | wxTB_DOCKABLE | wxTB_TEXT;
enum
{
// Create the main frame window
MyFrame* frame = new MyFrame((wxFrame *) NULL, -1,
"wxToolBar Sample",
- wxPoint(100, 100), wxSize(450, 300));
+ wxPoint(100, 100), wxSize(550, 300));
frame->Show(TRUE);
// Associate the menu bar with the frame
SetMenuBar(menuBar);
+ menuBar->Check(IDM_TOOLBAR_SHOW_BOTH, TRUE);
+
// Create the toolbar
RecreateToolbar();
}
style);
m_tbar->AddRadioTool(wxID_NEW, _T("First"), wxBITMAP(new));
- m_tbar->AddRadioTool(wxID_NEW, _T("Second"), wxBITMAP(new));
- m_tbar->AddRadioTool(wxID_NEW, _T("Third"), wxBITMAP(new));
+ m_tbar->AddRadioTool(wxID_OPEN, _T("Second"), wxBITMAP(open));
+ m_tbar->AddRadioTool(wxID_SAVE, _T("Third"), wxBITMAP(save));
m_tbar->AddSeparator();
m_tbar->AddTool(wxID_HELP, _T("Help"), wxBITMAP(help));
m_nSepCount = 1;
}
+ virtual void SetLabel(const wxString& label)
+ {
+ if ( label == m_label )
+ return;
+
+ wxToolBarToolBase::SetLabel(label);
+
+ // we need to update the label shown in the toolbar because it has a
+ // pointer to the internal buffer of the old label
+ //
+ // TODO: use TB_SETBUTTONINFO
+ }
+
// set/get the number of separators which we use to cover the space used by
// a control in the toolbar
void SetSeparatorsCount(size_t count) { m_nSepCount = count; }
wxLogDebug(wxT("TB_DELETEBUTTON failed"));
}
}
-
}
if ( addBitmap ) // no old bitmap or we can't replace it
// 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() )
{
wxZeroMemory(button);
+ bool isRadio = FALSE;
switch ( tool->GetStyle() )
{
case wxTOOL_STYLE_CONTROL:
case wxTOOL_STYLE_BUTTON:
button.iBitmap = bitmapId;
+
+ if ( HasFlag(wxTB_TEXT) && !tool->GetLabel().empty() )
+ {
+ button.iString = (int)tool->GetLabel().c_str();
+ }
+
button.idCommand = tool->GetId();
if ( tool->IsEnabled() )
if ( tool->IsToggled() )
button.fsState |= TBSTATE_CHECKED;
- button.fsStyle = tool->CanBeToggled() ? TBSTYLE_CHECK
- : TBSTYLE_BUTTON;
+ 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;
+ }
+
+ 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++;
}
}
}
+// ----------------------------------------------------------------------------
+// toolbar styles
+// ---------------------------------------------------------------------------
+
+void wxToolBar::SetWindowStyleFlag(long style)
+{
+ // there doesn't seem to be any reasonably simple way to prevent the
+ // toolbar from showing the icons so for now we don't honour wxTB_NOICONS
+ if ( (style & wxTB_TEXT) != (GetWindowStyle() & wxTB_TEXT) )
+ {
+ // update the strings of all toolbar buttons
+ //
+ // NB: we can only do it using TB_SETBUTTONINFO which is available
+ // in comctl32.dll >= 4.71 only
+#if defined(_WIN32_IE) && (_WIN32_IE >= 0x400 )
+ if ( wxTheApp->GetComCtl32Version() >= 471 )
+ {
+ // set the (underlying) separators width to be that of the
+ // control
+ TBBUTTONINFO tbbi;
+ tbbi.cbSize = sizeof(tbbi);
+ tbbi.dwMask = TBIF_TEXT;
+ if ( !(style & wxTB_TEXT) )
+ {
+ // don't show the text - remove the labels
+ tbbi.pszText = NULL;
+ }
+
+ for ( wxToolBarToolsList::Node *node = m_tools.GetFirst();
+ node;
+ node = node->GetNext() )
+ {
+ wxToolBarToolBase *tool = node->GetData();
+ if ( !tool->IsButton() )
+ {
+ continue;
+ }
+
+ if ( style & wxTB_TEXT )
+ {
+ // cast is harmless
+ tbbi.pszText = (wxChar *)tool->GetLabel().c_str();
+ }
+
+ if ( !SendMessage(GetHwnd(), TB_SETBUTTONINFO,
+ tool->GetId(), (LPARAM)&tbbi) )
+ {
+ // the id is probably invalid?
+ wxLogLastError(wxT("TB_SETBUTTONINFO"));
+ }
+ }
+
+ UpdateSize();
+ Refresh();
+ }
+#endif // comctl32.dll 4.71
+ }
+
+ wxToolBarBase::SetWindowStyleFlag(style);
+}
+
// ----------------------------------------------------------------------------
// tool state
// ----------------------------------------------------------------------------