// Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include #include #include "app_environment.h" #include "import_qml_components_plugins.h" #include "import_qml_plugins.h" #include #include #include #include class MyWindow : public QQuickWindow { bool forceResize = false; Q_OBJECT public: MyWindow(QQuickWindow *parent = nullptr) : QQuickWindow(parent) { setMaximumSize(QSize(800, 800)); this->setFlags(Qt::FramelessWindowHint); this->setColor("transparent"); } bool nativeEvent(const QByteArray& eventType_, void* message_, qintptr* result_) override { MSG* MSG_ = static_cast(message_); RECT rect{}; switch (MSG_->message) { case WM_NCHITTEST: { GetWindowRect((HWND) winId(), &rect); long mouseY = GET_Y_LPARAM(MSG_->lParam); if( mouseY > rect.top && mouseY < (rect.bottom - (rect.bottom - rect.top) * 0.9)) { *result_ = HTCAPTION; return true; } break; } case WM_NCLBUTTONDOWN: { if(MSG_->wParam == HTCAPTION) forceResize = true; break; } case WM_MOVE : { if(forceResize) { setPosition(this->x(),this->y() + this->height() * 0.2); resize(this->width(),this->height() + 100); forceResize = false; } break; } case WM_NCCALCSIZE: { if(MSG_->wParam) return true; } } return false; } }; int main(int argc, char *argv[]) { qmlRegisterType("TransparentIssueDemoApp", 1, 0, "MyWindow"); set_qt_environment(); QGuiApplication app(argc, argv); QQmlApplicationEngine engine; const QUrl url(u"qrc:/qt/qml/Main/main.qml"_qs); QObject::connect( &engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { if (!obj && url == objUrl) QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.addImportPath(QCoreApplication::applicationDirPath() + "/qml"); engine.addImportPath(":/"); engine.load(url); MyWindow *win = qobject_cast(engine.rootObjects().first()); HWND winH = (HWND) win->winId(); LONG_PTR CURRENTSTYLE = GetWindowLongPtrA(winH, GWL_STYLE); SetWindowLongPtrA(winH, GWL_STYLE, CURRENTSTYLE | WS_THICKFRAME); BOOL DARK = TRUE; DWM_SYSTEMBACKDROP_TYPE MAINWINDOWTYPE = DWMSBT_MAINWINDOW; DwmSetWindowAttribute(winH, DWMWA_USE_IMMERSIVE_DARK_MODE, &DARK, sizeof(DARK)); DwmSetWindowAttribute(winH, DWMWA_SYSTEMBACKDROP_TYPE, &MAINWINDOWTYPE, sizeof(MAINWINDOWTYPE)); MARGINS borderlessMargin = { 0, 0, 0, 1 }; DwmExtendFrameIntoClientArea(winH, &borderlessMargin); return app.exec(); } #include "main.moc"