Windows: Store only full-size DC's obtained by BeginPaint.

Avoid painting bugs in case the DC covers only a part of the
window and QBackingStore does a full flush.

Task-number: QTBUG-26039

Change-Id: Ic918d9898ac824690273ac59bcb1e7e546cc698a
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
This commit is contained in:
Friedemann Kleint 2012-06-07 13:42:13 +02:00 committed by Qt by Nokia
parent 6b95e54f1f
commit d728bfe793
2 changed files with 13 additions and 8 deletions

View File

@ -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;

View File

@ -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,