diff options
Diffstat (limited to 'vcl/source/window/menubarwindow.cxx')
-rw-r--r-- | vcl/source/window/menubarwindow.cxx | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/vcl/source/window/menubarwindow.cxx b/vcl/source/window/menubarwindow.cxx index f479f7387515..0b838b02d49d 100644 --- a/vcl/source/window/menubarwindow.cxx +++ b/vcl/source/window/menubarwindow.cxx @@ -24,6 +24,7 @@ #include <vcl/dockingarea.hxx> #include <vcl/settings.hxx> #include <vcl/taskpanelist.hxx> +#include <vcl/virdev.hxx> #include <sal/log.hxx> #include <salframe.hxx> @@ -912,47 +913,54 @@ void MenuBarWindow::Paint(vcl::RenderContext& rRenderContext, const tools::Recta return; } + // Make sure that all actual rendering happens in one go to avoid flicker. + ScopedVclPtrInstance<VirtualDevice> pBuffer; + pBuffer->SetOutputSizePixel(aOutputSize, false); + if (rRenderContext.IsNativeControlSupported(ControlType::Menubar, ControlPart::Entire)) { MenubarValue aMenubarValue; aMenubarValue.maTopDockingAreaHeight = ImplGetTopDockingAreaHeight(this); if (!rStyleSettings.GetPersonaHeader().IsEmpty()) - Erase(rRenderContext); + Erase(*pBuffer); else { tools::Rectangle aCtrlRegion( Point(), aOutputSize ); - rRenderContext.DrawNativeControl(ControlType::Menubar, ControlPart::Entire, aCtrlRegion, - ControlState::ENABLED, aMenubarValue, OUString()); + pBuffer->DrawNativeControl(ControlType::Menubar, ControlPart::Entire, aCtrlRegion, + ControlState::ENABLED, aMenubarValue, OUString()); } - ImplAddNWFSeparator(rRenderContext, aOutputSize, aMenubarValue); + ImplAddNWFSeparator(*pBuffer, aOutputSize, aMenubarValue); } // shrink the area of the buttons aOutputSize.AdjustWidth( -(aCloseBtn->GetSizePixel().Width()) ); - rRenderContext.SetFillColor(rStyleSettings.GetMenuColor()); - pMenu->ImplPaint(rRenderContext, aOutputSize, 0); + pBuffer->SetFillColor(rStyleSettings.GetMenuColor()); + pMenu->ImplPaint(*pBuffer, aOutputSize, 0); if (nHighlightedItem != ITEMPOS_INVALID && pMenu && !pMenu->GetItemList()->GetDataFromPos(nHighlightedItem)->bHiddenOnGUI) - HighlightItem(rRenderContext, nHighlightedItem); + HighlightItem(*pBuffer, nHighlightedItem); else if (ImplGetSVData()->maNWFData.mbRolloverMenubar && nRolloveredItem != ITEMPOS_INVALID) - HighlightItem(rRenderContext, nRolloveredItem); + HighlightItem(*pBuffer, nRolloveredItem); // in high contrast mode draw a separating line on the lower edge if (!rRenderContext.IsNativeControlSupported( ControlType::Menubar, ControlPart::Entire) && rStyleSettings.GetHighContrastMode()) { - rRenderContext.Push(PushFlags::LINECOLOR | PushFlags::MAPMODE); - rRenderContext.SetLineColor(COL_WHITE); - rRenderContext.SetMapMode(MapMode(MapUnit::MapPixel)); + pBuffer->Push(PushFlags::LINECOLOR | PushFlags::MAPMODE); + pBuffer->SetLineColor(COL_WHITE); + pBuffer->SetMapMode(MapMode(MapUnit::MapPixel)); Size aSize = GetSizePixel(); - rRenderContext.DrawLine(Point(0, aSize.Height() - 1), - Point(aSize.Width() - 1, aSize.Height() - 1)); - rRenderContext.Pop(); + pBuffer->DrawLine(Point(0, aSize.Height() - 1), + Point(aSize.Width() - 1, aSize.Height() - 1)); + pBuffer->Pop(); } + + rRenderContext.DrawOutDev(Point(0, 0), GetOutputSizePixel(), Point(0, 0), GetOutputSizePixel(), + *pBuffer); } void MenuBarWindow::Resize() |