+ if (m_disabledImgList != NULL)
+ {
+ delete m_disabledImgList;
+ m_disabledImgList = NULL;
+ }
+
+ // as we can't use disabled image list with older versions of comctl32.dll,
+ // don't even bother creating it
+ if ( wxApp::GetComCtl32Version() >= 470 )
+ {
+ // search for the first disabled button img in the toolbar, if any
+ for ( wxToolBarToolsList::compatibility_iterator
+ node = m_tools.GetFirst(); node; node = node->GetNext() )
+ {
+ wxToolBarToolBase *tool = node->GetData();
+ wxBitmap bmpDisabled = tool->GetDisabledBitmap();
+ if ( bmpDisabled.Ok() )
+ {
+ m_disabledImgList = new wxImageList
+ (
+ m_defaultWidth,
+ m_defaultHeight,
+ bmpDisabled.GetMask() != NULL,
+ GetToolsCount()
+ );
+ break;
+ }
+ }
+
+ // we don't have any disabled bitmaps
+ }
+}
+
+bool wxToolBar::Realize()
+{
+ const size_t nTools = GetToolsCount();
+ if ( nTools == 0 )
+ // nothing to do
+ return true;
+
+#ifdef wxREMAP_BUTTON_COLOURS
+ // don't change the values of these constants, they can be set from the
+ // user code via wxSystemOptions
+ enum
+ {
+ Remap_None = -1,
+ Remap_Bg,
+ Remap_Buttons,
+ Remap_TransparentBg
+ };
+
+ // the user-specified option overrides anything, but if it wasn't set, only
+ // remap the buttons on 8bpp displays as otherwise the bitmaps usually look
+ // much worse after remapping
+ static const wxChar *remapOption = wxT("msw.remap");
+ const int remapValue = wxSystemOptions::HasOption(remapOption)
+ ? wxSystemOptions::GetOptionInt(remapOption)
+ : wxDisplayDepth() <= 8 ? Remap_Buttons
+ : Remap_None;
+
+#endif // wxREMAP_BUTTON_COLOURS
+
+ // delete all old buttons, if any
+ for ( size_t pos = 0; pos < m_nButtons; pos++ )
+ {
+ if ( !::SendMessage(GetHwnd(), TB_DELETEBUTTON, 0, 0) )
+ {
+ wxLogDebug(wxT("TB_DELETEBUTTON failed"));
+ }
+ }
+
+ // First, add the bitmap: we use one bitmap for all toolbar buttons
+ // ----------------------------------------------------------------
+
+ wxToolBarToolsList::compatibility_iterator node;
+ int bitmapId = 0;
+
+ wxSize sizeBmp;
+ if ( HasFlag(wxTB_NOICONS) )
+ {
+ // no icons, don't leave space for them
+ sizeBmp.x =
+ sizeBmp.y = 0;
+ }
+ else // do show icons
+ {
+ // if we already have a bitmap, we'll replace the existing one --
+ // otherwise we'll install a new one
+ HBITMAP oldToolBarBitmap = (HBITMAP)m_hBitmap;
+
+ sizeBmp.x = m_defaultWidth;
+ sizeBmp.y = m_defaultHeight;
+
+ const wxCoord totalBitmapWidth = m_defaultWidth *
+ wx_truncate_cast(wxCoord, nTools),
+ totalBitmapHeight = m_defaultHeight;
+
+ // Create a bitmap and copy all the tool bitmaps into it
+ wxMemoryDC dcAllButtons;
+ wxBitmap bitmap(totalBitmapWidth, totalBitmapHeight);
+ dcAllButtons.SelectObject(bitmap);
+
+#ifdef wxREMAP_BUTTON_COLOURS
+ if ( remapValue != Remap_TransparentBg )
+#endif // wxREMAP_BUTTON_COLOURS
+ {
+ // VZ: why do we hardcode grey colour for CE?
+ dcAllButtons.SetBackground(wxBrush(
+#ifdef __WXWINCE__
+ wxColour(0xc0, 0xc0, 0xc0)
+#else // !__WXWINCE__
+ GetBackgroundColour()
+#endif // __WXWINCE__/!__WXWINCE__
+ ));
+ dcAllButtons.Clear();
+ }
+
+ m_hBitmap = bitmap.GetHBITMAP();
+ HBITMAP hBitmap = (HBITMAP)m_hBitmap;
+
+#ifdef wxREMAP_BUTTON_COLOURS
+ if ( remapValue == Remap_Bg )
+ {
+ dcAllButtons.SelectObject(wxNullBitmap);
+
+ // Even if we're not remapping the bitmap
+ // content, we still have to remap the background.
+ hBitmap = (HBITMAP)MapBitmap((WXHBITMAP) hBitmap,
+ totalBitmapWidth, totalBitmapHeight);
+
+ dcAllButtons.SelectObject(bitmap);
+ }
+#endif // wxREMAP_BUTTON_COLOURS
+
+ // the button position
+ wxCoord x = 0;
+
+ // the number of buttons (not separators)
+ int nButtons = 0;
+
+ CreateDisabledImageList();
+ for ( node = m_tools.GetFirst(); node; node = node->GetNext() )
+ {
+ wxToolBarToolBase *tool = node->GetData();
+ if ( tool->IsButton() )
+ {
+ const wxBitmap& bmp = tool->GetNormalBitmap();