summaryrefslogtreecommitdiff
path: root/vcl/source/window/menubarwindow.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/source/window/menubarwindow.cxx')
-rw-r--r--vcl/source/window/menubarwindow.cxx36
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()