diff options
Diffstat (limited to 'src/plugins/platforms/windows')
-rw-r--r-- | src/plugins/platforms/windows/qwindowsintegration.cpp | 2 | ||||
-rw-r--r-- | src/plugins/platforms/windows/qwindowswindow.cpp | 44 | ||||
-rw-r--r-- | src/plugins/platforms/windows/qwindowswindow.h | 1 |
3 files changed, 47 insertions, 0 deletions
diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp index 52950ecde5..7d4308d578 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.cpp +++ b/src/plugins/platforms/windows/qwindowsintegration.cpp @@ -265,6 +265,8 @@ bool QWindowsIntegration::hasCapability(QPlatformIntegration::Capability cap) co return true; # endif // QT_OPENGL_ES_2 #endif // !QT_NO_OPENGL + case WindowMasks: + return true; default: return QPlatformIntegration::hasCapability(cap); } diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index e49b215422..aabea04c20 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -53,6 +53,7 @@ #include <QtGui/QGuiApplication> #include <QtGui/QScreen> #include <QtGui/QWindow> +#include <QtGui/QRegion> #include <private/qwindow_p.h> #include <QtGui/QWindowSystemInterface> @@ -1344,6 +1345,49 @@ void QWindowsWindow::setOpacity(qreal level) } } +static inline HRGN createRectRegion(const QRect &r) +{ + return CreateRectRgn(r.left(), r.top(), r.x() + r.width(), r.y() + r.height()); +} + +static inline void addRectToWinRegion(const QRect &rect, HRGN *winRegion) +{ + if (const HRGN rectRegion = createRectRegion(rect)) { + HRGN result = CreateRectRgn(0, 0, 0, 0); + if (CombineRgn(result, *winRegion, rectRegion, RGN_OR)) { + DeleteObject(winRegion); + *winRegion = result; + } + DeleteObject(rectRegion); + } +} + +static HRGN qRegionToWinRegion(const QRegion ®ion) +{ + const QVector<QRect> rects = region.rects(); + if (rects.isEmpty()) + return NULL; + const int rectCount = rects.size(); + if (rectCount == 1) + return createRectRegion(region.boundingRect()); + HRGN hRegion = createRectRegion(rects.front()); + for (int i = 1; i < rectCount; ++i) + addRectToWinRegion(rects.at(i), &hRegion); + return hRegion; +} + +void QWindowsWindow::setMask(const QRegion ®ion) +{ + if (region.isEmpty()) { + SetWindowRgn(m_data.hwnd, 0, true); + return; + } + const HRGN winRegion = qRegionToWinRegion(region); + // SetWindowRgn takes ownership. + if (!SetWindowRgn(m_data.hwnd, winRegion, true)) + DeleteObject(winRegion); +} + void QWindowsWindow::requestActivateWindow() { if (QWindowsContext::verboseWindows) diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h index 2fd401029e..743e10dff9 100644 --- a/src/plugins/platforms/windows/qwindowswindow.h +++ b/src/plugins/platforms/windows/qwindowswindow.h @@ -168,6 +168,7 @@ public: virtual QMargins frameMargins() const; virtual void setOpacity(qreal level); + virtual void setMask(const QRegion ®ion); qreal opacity() const { return m_opacity; } virtual void requestActivateWindow(); |