diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index fe38e60697..4e93d2b258 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -989,7 +989,7 @@ HDC QWindowsWindow::getDC() void QWindowsWindow::releaseDC() { - if (m_hdc && !testFlag(WithinWmPaint)) { + if (m_hdc && !testFlag(DCFromBeginPaint)) { ReleaseDC(handle(), m_hdc); m_hdc = 0; } @@ -1013,17 +1013,22 @@ bool QWindowsWindow::handleWmPaint(HWND hwnd, UINT message, QRegion(qrectFromRECT(ps.rcPaint))); EndPaint(hwnd, &ps); } else { - releaseDC(); - m_hdc = BeginPaint(hwnd, &ps); - setFlag(WithinWmPaint); - + const HDC dc = BeginPaint(hwnd, &ps); const QRect updateRect = qrectFromRECT(ps.rcPaint); + if (updateRect.size() == m_data.geometry.size()) { + // Store DC for access by the backing store if it has the full size. + releaseDC(); + setFlag(DCFromBeginPaint); + m_hdc = dc; + } if (QWindowsContext::verboseIntegration) qDebug() << __FUNCTION__ << this << window() << updateRect; QWindowSystemInterface::handleSynchronousExposeEvent(window(), QRegion(updateRect)); - clearFlag(WithinWmPaint); - m_hdc = 0; + if (testFlag(DCFromBeginPaint)) { + clearFlag(DCFromBeginPaint); + m_hdc = 0; + } EndPaint(hwnd, &ps); } return true; diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h index 045da7d355..208c0d2c38 100644 --- a/src/plugins/platforms/windows/qwindowswindow.h +++ b/src/plugins/platforms/windows/qwindowswindow.h @@ -116,7 +116,7 @@ public: enum Flags { - WithinWmPaint = 0x1, + DCFromBeginPaint = 0x1, WithinSetParent = 0x2, FrameDirty = 0x4, //! Frame outdated by setStyle, recalculate in next query. OpenGLSurface = 0x10,