Signed-off-by: Yuhang Zhao <2546789017@qq.com>
This commit is contained in:
Yuhang Zhao 2020-04-04 16:35:47 +08:00
parent 01bde69ae6
commit 6a0f6f1672
3 changed files with 56 additions and 3 deletions

View File

@ -18,10 +18,8 @@ int main(int argc, char *argv[]) {
QApplication application(argc, argv); QApplication application(argc, argv);
WinNativeEventFilter::install();
QWidget widget; QWidget widget;
WinNativeEventFilter::updateQtFrame(widget.windowHandle()); WinNativeEventFilter::addFramelessWindow(&widget);
widget.show(); widget.show();
return QApplication::exec(); return QApplication::exec();

View File

@ -27,8 +27,10 @@
#include <QDebug> #include <QDebug>
#include <QGuiApplication> #include <QGuiApplication>
#include <QLibrary> #include <QLibrary>
#include <QObject>
#include <QOperatingSystemVersion> #include <QOperatingSystemVersion>
#include <QVariant> #include <QVariant>
#include <QWidget>
#include <QWindow> #include <QWindow>
#include <QtMath> #include <QtMath>
#include <d2d1.h> #include <d2d1.h>
@ -926,3 +928,52 @@ void WinNativeEventFilter::setTitlebarHeight(int tbh) {
m_titlebarHeight = tbh; m_titlebarHeight = tbh;
} }
} }
void WinNativeEventFilter::setFramelessWindows(QVector<QObject *> windows) {
if (!windows.isEmpty()) {
for (auto &&window : qAsConst(windows)) {
addFramelessWindow(window);
}
}
}
void WinNativeEventFilter::addFramelessWindow(QObject *window,
WINDOWDATA *data) {
if (window) {
const auto getWindowHandle = [](QWindow *win) -> HWND {
if (win && win->handle()) {
const auto handle =
QGuiApplication::platformNativeInterface()
->nativeResourceForWindow("handle", win);
if (handle) {
return static_cast<HWND>(handle);
}
}
return reinterpret_cast<HWND>(win->winId());
};
HWND hwnd = nullptr;
if (window->isWidgetType()) {
const auto widget = qobject_cast<QWidget *>(window);
if (widget) {
QWindow *const _window = widget->windowHandle();
if (_window) {
hwnd = getWindowHandle(_window);
} else {
hwnd = reinterpret_cast<HWND>(widget->winId());
}
}
} else if (window->isWindowType()) {
const auto _window = qobject_cast<QWindow *>(window);
if (_window) {
hwnd = getWindowHandle(_window);
}
} else {
qWarning().noquote() << "Only QWidget and QWindow are accepted.";
}
if (hwnd) {
addFramelessWindow(hwnd, data);
} else {
qWarning().noquote() << "Failed to acquire window handle.";
}
}
}

View File

@ -30,6 +30,7 @@
#include <qt_windows.h> #include <qt_windows.h>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
QT_FORWARD_DECLARE_CLASS(QObject)
QT_FORWARD_DECLARE_CLASS(QWindow) QT_FORWARD_DECLARE_CLASS(QWindow)
QT_END_NAMESPACE QT_END_NAMESPACE
@ -63,9 +64,12 @@ public:
// Frameless windows handle list // Frameless windows handle list
static QVector<HWND> framelessWindows(); static QVector<HWND> framelessWindows();
static void setFramelessWindows(QVector<HWND> windows); static void setFramelessWindows(QVector<HWND> windows);
static void setFramelessWindows(QVector<QObject *> windows);
// Make the given window become frameless. // Make the given window become frameless.
static void addFramelessWindow(HWND window, WINDOWDATA *data = nullptr); static void addFramelessWindow(HWND window, WINDOWDATA *data = nullptr);
static void addFramelessWindow(QObject *window, WINDOWDATA *data = nullptr);
static void removeFramelessWindow(HWND window); static void removeFramelessWindow(HWND window);
static void removeFramelessWindow(QObject *window);
static void clearFramelessWindows(); static void clearFramelessWindows();
// Set borderWidth, borderHeight or titlebarHeight to a negative value to // Set borderWidth, borderHeight or titlebarHeight to a negative value to