X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4a10ea8b13fd0851e71e6fa5ebbe5b93933be11e..6f02a879ed7efc5fcf6328ff47a1352ec82812b7:/src/msw/tbar95.cpp?ds=sidebyside diff --git a/src/msw/tbar95.cpp b/src/msw/tbar95.cpp index 754543b932..9015f5cf73 100644 --- a/src/msw/tbar95.cpp +++ b/src/msw/tbar95.cpp @@ -234,22 +234,15 @@ bool wxToolBar::Create(wxWindow *parent, wxSetCCUnicodeFormat(GetHwnd()); - // set up the colors and fonts - SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)); - SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); - // workaround for flat toolbar on Windows XP classic style: we have to set - // the style after creating the control, doing it at creation time doesn't - // work + // the style after creating the control; doing it at creation time doesn't work #if wxUSE_UXTHEME if ( style & wxTB_FLAT ) { LRESULT style = ::SendMessage(GetHwnd(), TB_GETSTYLE, 0, 0L); if ( !(style & TBSTYLE_FLAT) ) - { ::SendMessage(GetHwnd(), TB_SETSTYLE, 0, style | TBSTYLE_FLAT); - } } #endif // wxUSE_UXTHEME @@ -300,8 +293,8 @@ void wxToolBar::Recreate() ::SetParent(GetHwndOf(win), GetHwnd()); } - // only destroy the old toolbar now -- after all the children had been - // reparented + // only destroy the old toolbar now -- + // after all the children had been reparented ::DestroyWindow(hwndOld); // it is for the old bitmap control and can't be used with the new one @@ -318,7 +311,6 @@ void wxToolBar::Recreate() } Realize(); - UpdateSize(); } wxToolBar::~wxToolBar() @@ -327,14 +319,10 @@ wxToolBar::~wxToolBar() // is not - otherwise toolbar leaves a hole in the place it used to occupy wxFrame *frame = wxDynamicCast(GetParent(), wxFrame); if ( frame && !frame->IsBeingDeleted() ) - { frame->SendSizeEvent(); - } if ( m_hBitmap ) - { ::DeleteObject((HBITMAP) m_hBitmap); - } delete m_disabledImgList; } @@ -367,6 +355,7 @@ wxSize wxToolBar::DoGetBestSize() const } CacheBestSize(sizeBest); + return sizeBest; } @@ -379,8 +368,8 @@ WXDWORD wxToolBar::MSWGetStyle(long style, WXDWORD *exstyle) const (style & ~wxBORDER_MASK) | wxBORDER_NONE, exstyle ); - // always include this one, it never hurts and setting it later only if we - // do have tooltips wouldn't work + // always include this one, it never hurts and setting it later + // only if we do have tooltips wouldn't work msStyle |= TBSTYLE_TOOLTIPS; if ( style & (wxTB_FLAT | wxTB_HORZ_LAYOUT) ) @@ -393,14 +382,10 @@ WXDWORD wxToolBar::MSWGetStyle(long style, WXDWORD *exstyle) const // incorrect background colour - and not using it still results in the // correct (flat) toolbar, so don't use it there if ( s_verComCtl > 400 && s_verComCtl < 600 ) - { msStyle |= TBSTYLE_FLAT | TBSTYLE_TRANSPARENT; - } if ( s_verComCtl >= 470 && style & wxTB_HORZ_LAYOUT ) - { msStyle |= TBSTYLE_LIST; - } } if ( style & wxTB_NODIVIDER ) @@ -451,9 +436,7 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool) } if ( tool2->IsControl() ) - { pos += ((wxToolBarTool *)tool2)->GetSeparatorsCount() - 1; - } } // now determine the number of buttons to delete and the area taken by them @@ -471,7 +454,6 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool) if ( tool->IsControl() ) { nButtonsToDelete = ((wxToolBarTool *)tool)->GetSeparatorsCount(); - width *= nButtonsToDelete; } @@ -504,11 +486,18 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool) } InvalidateBestSize(); + return true; } void wxToolBar::CreateDisabledImageList() { + 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 ( wxTheApp->GetComCtl32Version() >= 470 ) @@ -528,43 +517,37 @@ void wxToolBar::CreateDisabledImageList() bmpDisabled.GetMask() != NULL, GetToolsCount() ); - return; + break; } } // we don't have any disabled bitmaps } - - m_disabledImgList = NULL; } bool wxToolBar::Realize() { const size_t nTools = GetToolsCount(); if ( nTools == 0 ) - { // nothing to do return true; - } 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 = doTransparent = false; + +#ifndef __WXWINCE__ + int remapValue = (-1); + const wxChar *remapOptionStr = wxT("msw.remap"); + if (wxSystemOptions::HasOption( remapOptionStr )) + remapValue = wxSystemOptions::GetOptionInt( remapOptionStr ); + + doTransparent = (remapValue == 2); + if (!doTransparent) { - doRemapBg = doRemap = false; - doTransparent = true; - } - else - { doRemap = !wxSystemOptions::HasOption(wxT("msw.remap")) - || wxSystemOptions::GetOptionInt(wxT("msw.remap")) == 1; + doRemap = (remapValue != 0); doRemapBg = !doRemap; - doTransparent = false; } #endif @@ -603,17 +586,18 @@ bool wxToolBar::Realize() wx_truncate_cast(wxCoord, nTools), totalBitmapHeight = m_defaultHeight; - // Create a bitmap and copy all the tool bitmaps to it + // Create a bitmap and copy all the tool bitmaps into it wxMemoryDC dcAllButtons; wxBitmap bitmap(totalBitmapWidth, totalBitmapHeight); dcAllButtons.SelectObject(bitmap); -#ifdef __WXWINCE__ - dcAllButtons.SetBackground(wxBrush(wxColour(192,192,192))); -#else + +#ifndef __WXWINCE__ if (doTransparent) dcAllButtons.SetBackground(*wxTRANSPARENT_BRUSH); else - dcAllButtons.SetBackground(*wxLIGHT_GREY_BRUSH); + dcAllButtons.SetBackground(wxBrush(GetBackgroundColour())); +#else + dcAllButtons.SetBackground(wxBrush(wxColour(192,192,192))); #endif dcAllButtons.Clear(); @@ -631,8 +615,6 @@ bool wxToolBar::Realize() totalBitmapWidth, totalBitmapHeight); dcAllButtons.SelectObject(bitmap); - - } #endif // !__WXWINCE__ @@ -670,7 +652,7 @@ bool wxToolBar::Realize() if ( m_disabledImgList ) { wxBitmap bmpDisabled = tool->GetDisabledBitmap(); -#if wxUSE_IMAGE +#if wxUSE_IMAGE && wxUSE_WXDIB if ( !bmpDisabled.Ok() ) { // no disabled bitmap specified but we still need to @@ -679,17 +661,20 @@ bool wxToolBar::Realize() wxImage imgGreyed; wxCreateGreyedImage(bmp.ConvertToImage(), imgGreyed); - // we need to have light grey background colour for - // MapBitmap() to work correctly - for ( int y = 0; y < h; y++ ) + if (doRemap) { - for ( int x = 0; x < w; x++ ) + // we need to have light grey background colour for + // MapBitmap() to work correctly + for ( int y = 0; y < h; y++ ) { - if ( imgGreyed.IsTransparent(x, y) ) - imgGreyed.SetRGB(x, y, - wxLIGHT_GREY->Red(), - wxLIGHT_GREY->Green(), - wxLIGHT_GREY->Blue()); + for ( int x = 0; x < w; x++ ) + { + if ( imgGreyed.IsTransparent(x, y) ) + imgGreyed.SetRGB(x, y, + wxLIGHT_GREY->Red(), + wxLIGHT_GREY->Green(), + wxLIGHT_GREY->Blue()); + } } } @@ -697,7 +682,8 @@ bool wxToolBar::Realize() } #endif // wxUSE_IMAGE - MapBitmap(bmpDisabled.GetHBITMAP(), w, h); + if (doRemap) + MapBitmap(bmpDisabled.GetHBITMAP(), w, h); m_disabledImgList->Add(bmpDisabled); } @@ -720,8 +706,6 @@ bool wxToolBar::Realize() // Map to system colours hBitmap = (HBITMAP)MapBitmap((WXHBITMAP) hBitmap, totalBitmapWidth, totalBitmapHeight); - - } bool addBitmap = true; @@ -816,7 +800,6 @@ bool wxToolBar::Realize() continue; } - TBBUTTON& button = buttons[i]; wxZeroMemory(button); @@ -841,9 +824,7 @@ bool wxToolBar::Realize() { const wxString& label = tool->GetLabel(); if ( !label.empty() ) - { button.iString = (int)label.c_str(); - } } button.idCommand = tool->GetId(); @@ -882,9 +863,8 @@ bool wxToolBar::Realize() break; if ( tool->Toggle(false) ) - { DoToggleTool(tool, false); - } + prevButton.fsState = TBSTATE_ENABLED; nodePrev = nodePrev->GetPrevious(); prevIndex--; @@ -898,12 +878,14 @@ bool wxToolBar::Realize() button.fsStyle = TBSTYLE_CHECK; break; + case wxITEM_NORMAL: + button.fsStyle = TBSTYLE_BUTTON; + break; + default: wxFAIL_MSG( _T("unexpected toolbar button kind") ); - // fall through - - case wxITEM_NORMAL: button.fsStyle = TBSTYLE_BUTTON; + break; } bitmapId++; @@ -957,7 +939,6 @@ bool wxToolBar::Realize() } wxControl *control = tool->GetControl(); - wxSize size = control->GetSize(); // the position of the leftmost controls corner @@ -1033,7 +1014,7 @@ bool wxToolBar::Realize() left = 0; top = y; - y += height + 2*GetMargins().y; + y += height + 2 * GetMargins().y; } else // horizontal toolbar { @@ -1053,22 +1034,18 @@ bool wxToolBar::Realize() if ( !isVertical ) { if ( m_maxRows == 0 ) - { // if not set yet, only one row SetRows(1); - } } else if ( m_nButtons > 0 ) // vertical non empty toolbar { if ( m_maxRows == 0 ) - { // if not set yet, have one column SetRows(m_nButtons); - } } InvalidateBestSize(); - SetBestFittingSize(); + UpdateSize(); return true; } @@ -1226,13 +1203,12 @@ wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord x, wxCoord y) const pt.x = x; pt.y = y; int index = (int)::SendMessage(GetHwnd(), TB_HITTEST, 0, (LPARAM)&pt); + // MBN: when the point ( x, y ) is close to the toolbar border // TB_HITTEST returns m_nButtons ( not -1 ) if ( index < 0 || (size_t)index >= m_nButtons ) - { // it's a separator or there is no tool at all there return (wxToolBarToolBase *)NULL; - } // when TB_SETBUTTONINFO is available (both during compile- and run-time), // we don't use the dummy separators hack @@ -1250,12 +1226,15 @@ wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord x, wxCoord y) const void wxToolBar::UpdateSize() { - // the toolbar size changed ::SendMessage(GetHwnd(), TB_AUTOSIZE, 0, 0); - // we must also refresh the frame after the toolbar size (possibly) changed + // In case Realize is called after the initial display (IOW the programmer + // may have rebuilt the toolbar) give the frame the option of resizing the + // toolbar to full width again, but only if the parent is a frame and the + // toolbar is managed by the frame. Otherwise assume that some other + // layout mechanism is controlling the toolbar size and leave it alone. wxFrame *frame = wxDynamicCast(GetParent(), wxFrame); - if ( frame ) + if ( frame && frame->GetToolBar() == this ) { frame->SendSizeEvent(); } @@ -1361,34 +1340,48 @@ void wxToolBar::OnMouseEvent(wxMouseEvent& event) // colour: for example, when it must blend in with a notebook page. void wxToolBar::OnEraseBackground(wxEraseEvent& event) { - wxColour bgCol = GetBackgroundColour(); - if (!bgCol.Ok()) - { - 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 - - RECT rect; - ::GetClientRect(GetHwnd(), &rect); - - HBRUSH hBrush = ::CreateSolidBrush(wxColourToRGB(bgCol)); - + RECT rect = wxGetClientRect(GetHwnd()); HDC hdc = GetHdcOf((*event.GetDC())); -#ifndef __WXWINCE__ - int mode = ::SetMapMode(hdc, MM_TEXT); -#endif + if ( UseBgCol() ) + { + // do draw our background + // + // 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 + AutoHBRUSH hBrush(wxColourToRGB(GetBackgroundColour())); - ::FillRect(hdc, &rect, hBrush); - ::DeleteObject(hBrush); + wxCHANGE_HDC_MAP_MODE(hdc, MM_TEXT); + ::FillRect(hdc, &rect, hBrush); + } + else // we have no non default background colour + { +#if wxUSE_UXTHEME + // we may need to draw themed colour so that we appear correctly on + // e.g. notebook page under XP with themes but only do it if the parent + // draws themed background itself + if ( !GetParent()->UseBgCol() ) + { + wxUxThemeEngine *theme = wxUxThemeEngine::GetIfActive(); + if ( theme ) + { + HRESULT + hr = theme->DrawThemeParentBackground(GetHwnd(), hdc, &rect); + if ( hr == S_OK ) + return; + + // it can also return S_FALSE which seems to simply say that it + // didn't draw anything but no error really occurred + if ( FAILED(hr) ) + wxLogApiError(_T("DrawThemeParentBackground(toolbar)"), hr); + } + } +#endif // wxUSE_UXTHEME -#ifndef __WXWINCE__ - ::SetMapMode(hdc, mode); -#endif + event.Skip(); + return; + } } bool wxToolBar::HandleSize(WXWPARAM WXUNUSED(wParam), WXLPARAM lParam) @@ -1439,10 +1432,10 @@ bool wxToolBar::HandleSize(WXWPARAM WXUNUSED(wParam), WXLPARAM lParam) bool wxToolBar::HandlePaint(WXWPARAM wParam, WXLPARAM lParam) { - // erase any dummy separators which we used for aligning the controls if - // any here + // erase any dummy separators which were used + // for aligning the controls if any here - // first of all, do we have any controls at all? + // first of all, are there any controls at all? wxToolBarToolsList::compatibility_iterator node; for ( node = m_tools.GetFirst(); node; node = node->GetNext() ) { @@ -1451,10 +1444,8 @@ bool wxToolBar::HandlePaint(WXWPARAM wParam, WXLPARAM lParam) } if ( !node ) - { // no controls, nothing to erase return false; - } // prepare the DC on which we'll be drawing wxClientDC dc(this); @@ -1463,10 +1454,8 @@ bool wxToolBar::HandlePaint(WXWPARAM wParam, WXLPARAM lParam) RECT r; if ( !::GetUpdateRect(GetHwnd(), &r, FALSE) ) - { // nothing to redraw anyhow return false; - } wxRect rectUpdate; wxCopyRECTToRect(r, rectUpdate); @@ -1544,14 +1533,14 @@ void wxToolBar::HandleMouseMove(WXWPARAM WXUNUSED(wParam), WXLPARAM lParam) wxToolBarToolBase* tool = FindToolForPosition( x, y ); // cursor left current tool - if( tool != m_pInTool && !tool ) + if ( tool != m_pInTool && !tool ) { m_pInTool = 0; OnMouseEnter( -1 ); } // cursor entered a tool - if( tool != m_pInTool && tool ) + if ( tool != m_pInTool && tool ) { m_pInTool = tool; OnMouseEnter( tool->GetId() ); @@ -1578,6 +1567,9 @@ WXLRESULT wxToolBar::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam if ( HandlePaint(wParam, lParam) ) return 0; #endif + + default: + break; } return wxControl::MSWWindowProc(nMsg, wParam, lParam); @@ -1693,5 +1685,5 @@ WXHBITMAP wxToolBar::MapBitmap(WXHBITMAP bitmap, int width, int height) #endif // 0 } -#endif // wxUSE_TOOLBAR && Win95 +#endif // wxUSE_TOOLBAR