X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/abf912c5a1ad04f186de5f3992339b882ef6b0cb..86a6ecff59dfa3143b9a4a3a452e480e2210300b:/src/msw/tbar95.cpp diff --git a/src/msw/tbar95.cpp b/src/msw/tbar95.cpp index 6636f4cebd..9cf966b5af 100644 --- a/src/msw/tbar95.cpp +++ b/src/msw/tbar95.cpp @@ -39,10 +39,11 @@ #include "wx/control.h" #endif -#if wxUSE_TOOLBAR && wxUSE_TOOLBAR_NATIVE && (!defined(_WIN32_WCE) || (_WIN32_WCE >= 400 && !defined(__POCKETPC__) && !defined(__SMARTPHONE__))) +#if wxUSE_TOOLBAR && wxUSE_TOOLBAR_NATIVE && !defined(__SMARTPHONE__) #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 @@ -387,7 +397,7 @@ WXDWORD wxToolBar::MSWGetStyle(long style, WXDWORD *exstyle) const if ( style & (wxTB_FLAT | wxTB_HORZ_LAYOUT) ) { // static as it doesn't change during the program lifetime - static int s_verComCtl = wxTheApp->GetComCtl32Version(); + static int s_verComCtl = wxApp::GetComCtl32Version(); // comctl32.dll 4.00 doesn't support the flat toolbars and using this // style with 6.00 (part of Windows XP) leads to the toolbar with @@ -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; @@ -640,7 +731,7 @@ bool wxToolBar::Realize() if ( oldToolBarBitmap ) { #ifdef TB_REPLACEBITMAP - if ( wxTheApp->GetComCtl32Version() >= 400 ) + if ( wxApp::GetComCtl32Version() >= 400 ) { TBREPLACEBITMAP replaceBitmap; replaceBitmap.hInstOld = NULL; @@ -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 @@ -709,7 +813,7 @@ bool wxToolBar::Realize() // 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 ) + wxApp::GetComCtl32Version() <= 472 ) { continue; } @@ -842,7 +946,7 @@ bool wxToolBar::Realize() #ifdef TB_SETBUTTONINFO // available in headers, now check whether it is available now // (during run-time) - if ( wxTheApp->GetComCtl32Version() >= 471 ) + if ( wxApp::GetComCtl32Version() >= 471 ) { // set the (underlying) separators width to be that of the // control @@ -963,8 +1067,8 @@ bool wxToolBar::MSWCommand(WXUINT WXUNUSED(cmd), WXWORD id) LRESULT state = ::SendMessage(GetHwnd(), TB_GETSTATE, id, 0); toggled = (state & TBSTATE_CHECKED) != 0; - // ignore the event when a radio button is released, as this doesn't seem to - // happen at all, and is handled otherwise + // ignore the event when a radio button is released, as this doesn't + // seem to happen at all, and is handled otherwise if ( tool->GetKind() == wxITEM_RADIO && !toggled ) return true; @@ -979,7 +1083,7 @@ bool wxToolBar::MSWCommand(WXUINT WXUNUSED(cmd), WXWORD id) // revert back tool->Toggle(!toggled); - ::SendMessage(GetHwnd(), TB_CHECKBUTTON, id, MAKELONG(toggled, 0)); + ::SendMessage(GetHwnd(), TB_CHECKBUTTON, id, MAKELONG(!toggled, 0)); } return true; @@ -1056,7 +1160,7 @@ wxSize wxToolBar::GetToolSize() const #if defined(_WIN32_IE) && (_WIN32_IE >= 0x300 ) \ && !( defined(__GNUWIN32__) && !wxCHECK_W32API_VERSION( 1, 0 ) ) \ && !defined (__DIGITALMARS__) - if ( wxTheApp->GetComCtl32Version() >= 470 ) + if ( wxApp::GetComCtl32Version() >= 470 ) { DWORD dw = ::SendMessage(GetHwnd(), TB_GETBUTTONSIZE, 0, 0); @@ -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(); @@ -1109,7 +1213,7 @@ wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord x, wxCoord y) const // if comctl32 version < 4.71 wxToolBar95 adds dummy spacers #if defined(_WIN32_IE) && (_WIN32_IE >= 0x400 ) - if ( wxTheApp->GetComCtl32Version() >= 471 ) + if ( wxApp::GetComCtl32Version() >= 471 ) { return m_tools.Item((size_t)index)->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);