Further fixes to widget masking

If mask was set to a widget before the widget was shown,
the mask was not applied.

Also, if toplevel widgets were set a mask in Windows, the mask was
applied to frame coordinates instead of client coordinates.

Ported relevant code from Qt4 to fix these issues.

Change-Id: Id6187cf4952b81b5b60c167e2fd284b7dc83ed9c
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
This commit is contained in:
Miikka Heikkinen 2012-06-27 17:15:42 +03:00 committed by Qt by Nokia
parent 4dd2de9c76
commit bbb15b4612
2 changed files with 10 additions and 0 deletions

View File

@ -1392,6 +1392,13 @@ void QWindowsWindow::setMask(const QRegion &region)
return; return;
} }
const HRGN winRegion = qRegionToWinRegion(region); const HRGN winRegion = qRegionToWinRegion(region);
// Mask is in client area coordinates, so offset it in case we have a frame
if (window()->isTopLevel()) {
const QMargins margins = frameMargins();
OffsetRgn(winRegion, margins.left(), margins.top());
}
// SetWindowRgn takes ownership. // SetWindowRgn takes ownership.
if (!SetWindowRgn(m_data.hwnd, winRegion, true)) if (!SetWindowRgn(m_data.hwnd, winRegion, true))
DeleteObject(winRegion); DeleteObject(winRegion);

View File

@ -151,6 +151,9 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
// Check children and create windows for them if necessary // Check children and create windows for them if necessary
q_createNativeChildrenAndSetParent(q); q_createNativeChildrenAndSetParent(q);
if (extra && !extra->mask.isEmpty())
setMask_sys(extra->mask);
// If widget is already shown, set window visible, too // If widget is already shown, set window visible, too
if (q->isVisible()) if (q->isVisible())
win->setVisible(true); win->setVisible(true);