From b37969bb5d889961a19220a5026c98ce692e4ca7 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 25 Jan 2012 12:31:50 +0100 Subject: [PATCH] Windows Vista Style: Fix drawing of buttons in message boxes. Do not use the HDC of the backing store when drawing to an image (as opposed to 4.8, where the HDC of the paint engine was used). This causes 'ghost buttons' to appear in the dialog box at 0,0. Change-Id: I301b66abf4447a65ee144f09655b68efaf18700d Reviewed-by: Oliver Wolff --- src/widgets/styles/qwindowsvistastyle.cpp | 4 ++-- src/widgets/styles/qwindowsxpstyle.cpp | 5 ++--- src/widgets/styles/qwindowsxpstyle_p.h | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/widgets/styles/qwindowsvistastyle.cpp b/src/widgets/styles/qwindowsvistastyle.cpp index 09aec2f484c..252740cbab9 100644 --- a/src/widgets/styles/qwindowsvistastyle.cpp +++ b/src/widgets/styles/qwindowsvistastyle.cpp @@ -1010,12 +1010,12 @@ void QWindowsVistaStyle::drawControl(ControlElement element, const QStyleOption QPainter startPainter(&startImage); stateId = PBS_DEFAULTED; XPThemeData theme(widget, &startPainter, name, partId, stateId, rect); - d->drawBackground(theme); + d->drawBackground(theme, true); // Do not draw on HDC of backing store. QPainter alternatePainter(&alternateImage); theme.stateId = PBS_DEFAULTED_ANIMATING; theme.painter = &alternatePainter; - d->drawBackground(theme); + d->drawBackground(theme, true); // Do not draw on HDC of backing store. pulse->setPrimaryImage(startImage); pulse->setAlternateImage(alternateImage); pulse->setStartTime(QTime::currentTime()); diff --git a/src/widgets/styles/qwindowsxpstyle.cpp b/src/widgets/styles/qwindowsxpstyle.cpp index eaeb336a61f..c112e62c6c2 100644 --- a/src/widgets/styles/qwindowsxpstyle.cpp +++ b/src/widgets/styles/qwindowsxpstyle.cpp @@ -665,7 +665,7 @@ bool QWindowsXPStylePrivate::swapAlphaChannel(const QRect &rect, bool allPixels) - Theme part is flipped (mirrored horizontally) else use drawBackgroundDirectly(). */ -void QWindowsXPStylePrivate::drawBackground(XPThemeData &themeData) +void QWindowsXPStylePrivate::drawBackground(XPThemeData &themeData, bool forceFallback) { if (themeData.rect.isEmpty()) return; @@ -693,14 +693,13 @@ void QWindowsXPStylePrivate::drawBackground(XPThemeData &themeData) dc = static_cast(nativeInterface->nativeResourceForBackingStore("getDC", backingStore )); } - bool useFallback = dc == 0 + const bool useFallback = forceFallback || dc == 0 || painter->opacity() != 1.0 || themeData.rotate || complexXForm || themeData.mirrorVertically || (themeData.mirrorHorizontally && pDrawThemeBackgroundEx == 0) || translucentToplevel; - if (!useFallback) drawBackgroundDirectly(themeData); else diff --git a/src/widgets/styles/qwindowsxpstyle_p.h b/src/widgets/styles/qwindowsxpstyle_p.h index 154fe3386c2..44dc8e8bdbb 100644 --- a/src/widgets/styles/qwindowsxpstyle_p.h +++ b/src/widgets/styles/qwindowsxpstyle_p.h @@ -312,7 +312,7 @@ public: QRegion region(XPThemeData &themeData); void setTransparency(QWidget *widget, XPThemeData &themeData); - void drawBackground(XPThemeData &themeData); + void drawBackground(XPThemeData &themeData, bool forceFallback = false); void drawBackgroundThruNativeBuffer(XPThemeData &themeData); void drawBackgroundDirectly(XPThemeData &themeData);