Fix repaint issue when resizing a window in Windows

QWindowsWindow::handleWmPaint() cached the device context it got from
BeginPaint call and used that for the window when the backing store
blitted itself to the window. The problem with this device context is
that the clipping region is set to only encompass the newly exposed
areas, which means any changes caused by the resize on the previously
exposed area were not repainted.

Fixed by removing the DC caching. The benefit was minimal anyway.

Change-Id: I8bd3c4031432ce6b52434c80bfe65d35d9feae49
Reviewed-by: Qt Doc Bot <qt_docbot@qt-project.org>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
This commit is contained in:
Miikka Heikkinen 2012-09-12 13:09:42 +03:00 committed by Qt by Nokia
parent 77cd2f6797
commit 1438ad5d30
2 changed files with 5 additions and 15 deletions

View File

@ -1100,7 +1100,7 @@ HDC QWindowsWindow::getDC()
void QWindowsWindow::releaseDC()
{
if (m_hdc && !testFlag(DCFromBeginPaint)) {
if (m_hdc) {
ReleaseDC(handle(), m_hdc);
m_hdc = 0;
}
@ -1124,22 +1124,13 @@ bool QWindowsWindow::handleWmPaint(HWND hwnd, UINT message,
QRegion(qrectFromRECT(ps.rcPaint)));
EndPaint(hwnd, &ps);
} else {
const HDC dc = BeginPaint(hwnd, &ps);
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));
if (testFlag(DCFromBeginPaint)) {
clearFlag(DCFromBeginPaint);
m_hdc = 0;
}
EndPaint(hwnd, &ps);
}
return true;

View File

@ -116,7 +116,7 @@ public:
enum Flags
{
DCFromBeginPaint = 0x1,
AutoMouseCapture = 0x1, //! Automatic mouse capture on button press.
WithinSetParent = 0x2,
FrameDirty = 0x4, //! Frame outdated by setStyle, recalculate in next query.
OpenGLSurface = 0x10,
@ -126,8 +126,7 @@ public:
SizeGripOperation = 0x100,
FrameStrutEventsEnabled = 0x200,
SynchronousGeometryChangeEvent = 0x400,
WithinSetStyle = 0x800,
AutoMouseCapture = 0x1000 //! Automatic mouse capture on button press.
WithinSetStyle = 0x800
};
struct WindowData