Windows: More fine-grained paint event handling.

Pass expose events to GL widgets, handle invalid
update rectangles, ignore WM_ERASEBKND (using code from 4.8).

Change-Id: Ide062efb392292fff556d37b0ef0e880676748a2
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
This commit is contained in:
Friedemann Kleint 2011-10-27 10:31:29 +02:00 committed by Qt by Nokia
parent abf25d3f64
commit 19b029cd9d
3 changed files with 15 additions and 5 deletions

View File

@ -680,8 +680,7 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message,
}
break;
case QtWindows::ExposeEvent:
platformWindow->handleWmPaint(hwnd, message, wParam, lParam);
return true;
return platformWindow->handleWmPaint(hwnd, message, wParam, lParam);
case QtWindows::MouseWheelEvent:
case QtWindows::MouseEvent:
case QtWindows::NonClientMouseEvent:

View File

@ -942,12 +942,22 @@ void QWindowsWindow::releaseDC()
}
}
void QWindowsWindow::handleWmPaint(HWND hwnd, UINT,
bool QWindowsWindow::handleWmPaint(HWND hwnd, UINT message,
WPARAM, LPARAM)
{
// Ignore invalid update bounding rectangles
if (!GetUpdateRect(m_data.hwnd, 0, FALSE))
return false;
if (message == WM_ERASEBKGND) // Backing store - ignored.
return true;
PAINTSTRUCT ps;
if (testFlag(OpenGLSurface)) {
BeginPaint(hwnd, &ps); // WM_ERASEBKGND needs to be handled.
// Observed painting problems with Aero style disabled (QTBUG-7865).
if (testFlag(OpenGLDoubleBuffered))
InvalidateRect(hwnd, 0, false);
BeginPaint(hwnd, &ps);
QWindowSystemInterface::handleSynchronousExposeEvent(window(),
QRegion(qrectFromRECT(ps.rcPaint)));
EndPaint(hwnd, &ps);
} else {
releaseDC();
@ -963,6 +973,7 @@ void QWindowsWindow::handleWmPaint(HWND hwnd, UINT,
m_hdc = 0;
EndPaint(hwnd, &ps);
}
return true;
}
void QWindowsWindow::setWindowTitle(const QString &title)

View File

@ -156,7 +156,7 @@ public:
{ return GetWindowLongPtr(m_data.hwnd, GWL_EXSTYLE); }
void setExStyle(unsigned s) const;
void handleWmPaint(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
bool handleWmPaint(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
void handleMoved();
void handleResized(int wParam);