X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0356c2597ec9f604918c880e3057650a7bf467f6..172541f64be8fcddb08f1c121da256d08c24a70b:/src/msw/tbar95.cpp diff --git a/src/msw/tbar95.cpp b/src/msw/tbar95.cpp index 56df126fa4..56f1bc60c5 100644 --- a/src/msw/tbar95.cpp +++ b/src/msw/tbar95.cpp @@ -43,6 +43,7 @@ #include "wx/toolbar.h" #include "wx/sysopt.h" +#include "wx/image.h" #include "wx/msw/private.h" @@ -213,6 +214,7 @@ wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control) void wxToolBar::Init() { m_hBitmap = 0; + m_disabledImgList = NULL; m_nButtons = 0; @@ -321,6 +323,12 @@ void wxToolBar::Recreate() m_hBitmap = 0; } + if ( m_disabledImgList ) + { + delete m_disabledImgList; + m_disabledImgList = NULL; + } + Realize(); UpdateSize(); } @@ -339,6 +347,8 @@ wxToolBar::~wxToolBar() { ::DeleteObject((HBITMAP) m_hBitmap); } + + delete m_disabledImgList; } wxSize wxToolBar::DoGetBestSize() const @@ -508,6 +518,37 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool) return true; } +void wxToolBar::CreateDisabledImageList() +{ + // as we can't use disabled image list with older versions of comctl32.dll, + // don't even bother creating it + if ( wxTheApp->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() + ); + return; + } + } + + // we don't have any disabled bitmaps + } + + m_disabledImgList = NULL; +} + bool wxToolBar::Realize() { const size_t nTools = GetToolsCount(); @@ -520,6 +561,11 @@ bool wxToolBar::Realize() const bool isVertical = HasFlag(wxTB_VERTICAL); bool doRemap, doRemapBg, doTransparent; +#ifdef __WXWINCE__ + doRemapBg = false; + doRemap = false; + doTransparent = false; +#else if (wxSystemOptions::GetOptionInt(wxT("msw.remap")) == 2) { doRemapBg = doRemap = false; @@ -531,6 +577,7 @@ bool wxToolBar::Realize() doRemapBg = !doRemap; doTransparent = false; } +#endif // delete all old buttons, if any for ( size_t pos = 0; pos < m_nButtons; pos++ ) @@ -570,15 +617,20 @@ bool wxToolBar::Realize() wxMemoryDC dcAllButtons; wxBitmap bitmap(totalBitmapWidth, totalBitmapHeight); dcAllButtons.SelectObject(bitmap); +#ifdef __WXWINCE__ + dcAllButtons.SetBackground(wxBrush(wxColour(192,192,192))); +#else if (doTransparent) dcAllButtons.SetBackground(*wxTRANSPARENT_BRUSH); else - dcAllButtons.SetBackground(*wxLIGHT_GREY_BRUSH); + dcAllButtons.SetBackground(*wxLIGHT_GREY_BRUSH); +#endif dcAllButtons.Clear(); m_hBitmap = bitmap.GetHBITMAP(); HBITMAP hBitmap = (HBITMAP)m_hBitmap; +#ifndef __WXWINCE__ if (doRemapBg) { dcAllButtons.SelectObject(wxNullBitmap); @@ -589,7 +641,10 @@ bool wxToolBar::Realize() totalBitmapWidth, totalBitmapHeight); dcAllButtons.SelectObject(bitmap); + + } +#endif // !__WXWINCE__ // the button position wxCoord x = 0; @@ -597,6 +652,7 @@ bool wxToolBar::Realize() // the number of buttons (not separators) int nButtons = 0; + CreateDisabledImageList(); for ( node = m_tools.GetFirst(); node; node = node->GetNext() ) { wxToolBarToolBase *tool = node->GetData(); @@ -615,6 +671,39 @@ bool wxToolBar::Realize() wxFAIL_MSG( _T("invalid tool button bitmap") ); } + // also deal with disabled bitmap if we want to use them + if ( m_disabledImgList ) + { + wxBitmap bmpDisabled = tool->GetDisabledBitmap(); + if ( !bmpDisabled.Ok() ) + { +#if wxUSE_IMAGE + // no disabled bitmap specified but we still need to + // fill the space in the image list with something, so + // we grey out the normal bitmap + wxImage img = bmp.ConvertToImage(); +#if 0 + img.SetMaskColour(wxLIGHT_GREY->Red(), + wxLIGHT_GREY->Green(), + wxLIGHT_GREY->Blue()); +#endif + wxImage imgGreyed; + wxCreateGreyedImage(img, imgGreyed); + + bmpDisabled = wxBitmap(imgGreyed); +#if 0 + bmpDisabled.SetMask(new wxMask(bmpDisabled, *wxLIGHT_GREY)); + + MapBitmap(bmpDisabled.GetHBITMAP(), + bmpDisabled.GetWidth(), + bmpDisabled.GetHeight()); +#endif // 0 +#endif // wxUSE_IMAGE + } + + m_disabledImgList->Add(bmpDisabled); + } + // still inc width and number of buttons because otherwise the // subsequent buttons will all be shifted which is rather confusing // (and like this you'd see immediately which bitmap was bad) @@ -633,6 +722,8 @@ bool wxToolBar::Realize() // Map to system colours hBitmap = (HBITMAP)MapBitmap((WXHBITMAP) hBitmap, totalBitmapWidth, totalBitmapHeight); + + } bool addBitmap = true; @@ -682,6 +773,19 @@ bool wxToolBar::Realize() wxFAIL_MSG(wxT("Could not add bitmap to toolbar")); } } + + if ( m_disabledImgList ) + { + HIMAGELIST oldImageList = (HIMAGELIST) + ::SendMessage(GetHwnd(), + TB_SETDISABLEDIMAGELIST, + 0, + (LPARAM)GetHimagelistOf(m_disabledImgList)); + + // delete previous image list if any + if ( oldImageList ) + ::DeleteObject( oldImageList ); + } } // don't call SetToolBitmapSize() as we don't want to change the values of @@ -1076,7 +1180,7 @@ wxToolBarToolBase *GetItemSkippingDummySpacers(const wxToolBarToolsList& tools, { wxToolBarToolsList::compatibility_iterator current = tools.GetFirst(); - for ( ; current != 0; current = current->GetNext() ) + for ( ; current ; current = current->GetNext() ) { if ( index == 0 ) return current->GetData(); @@ -1239,7 +1343,7 @@ void wxToolBar::OnEraseBackground(wxEraseEvent& event) event.Skip(); return; } - + // notice that this 'dumb' implementation may cause flicker for some of the // controls in which case they should intercept wxEraseEvent and process it // themselves somehow @@ -1434,20 +1538,22 @@ WXLRESULT wxToolBar::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam { switch ( nMsg ) { - case WM_SIZE: - if ( HandleSize(wParam, lParam) ) - return 0; - break; - case WM_MOUSEMOVE: // we don't handle mouse moves, so always pass the message to - // wxControl::MSWWindowProc + // wxControl::MSWWindowProc (HandleMouseMove just calls OnMouseEnter) HandleMouseMove(wParam, lParam); break; + case WM_SIZE: + if ( HandleSize(wParam, lParam) ) + return 0; + break; + +#ifndef __WXWINCE__ case WM_PAINT: if ( HandlePaint(wParam, lParam) ) return 0; +#endif } return wxControl::MSWWindowProc(nMsg, wParam, lParam);