diff --git a/examples/mainwindow/MainWindow.ui b/examples/mainwindow/MainWindow.ui
index 0dc3e7e..e2aa7a7 100644
--- a/examples/mainwindow/MainWindow.ui
+++ b/examples/mainwindow/MainWindow.ui
@@ -11,7 +11,7 @@
- MainWindow
+ Hello, World!
diff --git a/examples/mainwindow/TitleBar.ui b/examples/mainwindow/TitleBar.ui
index af4c2c2..49484ea 100644
--- a/examples/mainwindow/TitleBar.ui
+++ b/examples/mainwindow/TitleBar.ui
@@ -130,7 +130,7 @@
- Window Title
+ Hello, World!
Qt::AlignCenter
diff --git a/examples/mainwindow/mainwindow.cpp b/examples/mainwindow/mainwindow.cpp
index c55dd65..e0ce948 100644
--- a/examples/mainwindow/mainwindow.cpp
+++ b/examples/mainwindow/mainwindow.cpp
@@ -151,8 +151,6 @@ void MainWindow::mouseDoubleClickEvent(QMouseEvent *event)
void MainWindow::setupUi()
{
- resize(800, 600);
-
appMainWindow = new Ui::MainWindow;
appMainWindow->setupUi(this);
@@ -183,8 +181,6 @@ void MainWindow::setupUi()
titleBarWidget->maximizeButton->setChecked(check);
titleBarWidget->maximizeButton->setToolTip(check ? tr("Restore") : tr("Maximize"));
});
-
- setWindowTitle(tr("Hello, World!"));
}
bool MainWindow::isInTitleBarDraggableArea(const QPoint &pos) const
diff --git a/examples/widget/widget.cpp b/examples/widget/widget.cpp
index bc114a5..b051694 100644
--- a/examples/widget/widget.cpp
+++ b/examples/widget/widget.cpp
@@ -75,12 +75,6 @@ static const QString mainStyleSheet = QStringLiteral(R"(#MainWidget {
}
)");
-[[nodiscard]] static inline bool isTitleBarColorized()
-{
- const DwmColorizationArea area = Utilities::getDwmColorizationArea();
- return ((area == DwmColorizationArea::TitleBar_WindowBorder) || (area == DwmColorizationArea::All));
-}
-
Widget::Widget(QWidget *parent) : QWidget(parent)
{
setAttribute(Qt::WA_DontCreateNativeAncestors);
@@ -290,7 +284,7 @@ void Widget::updateStyleSheet()
{
const bool active = isActiveWindow();
const bool dark = Utilities::shouldAppsUseDarkMode();
- const bool colorizedTitleBar = isTitleBarColorized();
+ const bool colorizedTitleBar = Utilities::isTitleBarColorized();
const QColor titleBarWidgetBackgroundColor = [active, colorizedTitleBar, dark]() -> QColor {
if (active) {
if (colorizedTitleBar) {
@@ -320,7 +314,7 @@ void Widget::updateStyleSheet()
void Widget::updateSystemButtonIcons()
{
- const QString prefix = ((Utilities::shouldAppsUseDarkMode() || isTitleBarColorized()) ? QStringLiteral("light") : QStringLiteral("dark"));
+ const QString prefix = ((Utilities::shouldAppsUseDarkMode() || Utilities::isTitleBarColorized()) ? QStringLiteral("light") : QStringLiteral("dark"));
m_minimizeButton->setIcon(QIcon(QStringLiteral(":/images/%1/chrome-minimize.svg").arg(prefix)));
if (isMaximized() || isFullScreen()) {
m_maximizeButton->setIcon(QIcon(QStringLiteral(":/images/%1/chrome-restore.svg").arg(prefix)));
diff --git a/framelesshelper_windows.h b/framelesshelper_windows.h
index ed3ce21..147963d 100644
--- a/framelesshelper_windows.h
+++ b/framelesshelper_windows.h
@@ -71,7 +71,6 @@
#endif
#include
-#include
#include
#include
#include
@@ -101,6 +100,10 @@
# define SM_CXPADDEDBORDER (92)
#endif
+#ifndef SM_CYPADDEDBORDER
+# define SM_CYPADDEDBORDER SM_CXPADDEDBORDER
+#endif
+
#ifndef ABM_GETAUTOHIDEBAREX
# define ABM_GETAUTOHIDEBAREX (0x0000000b)
#endif
diff --git a/framelessquickhelper.cpp b/framelessquickhelper.cpp
index 001ce42..1a5460a 100644
--- a/framelessquickhelper.cpp
+++ b/framelessquickhelper.cpp
@@ -135,11 +135,7 @@ QColor FramelessQuickUtils::systemAccentColor()
bool FramelessQuickUtils::titleBarColorVisible()
{
#ifdef Q_OS_WINDOWS
- if (!Utilities::isWin10OrGreater()) {
- return false;
- }
- const DwmColorizationArea area = Utilities::getDwmColorizationArea();
- return ((area == DwmColorizationArea::TitleBar_WindowBorder) || (area == DwmColorizationArea::All));
+ return Utilities::isTitleBarColorized();
#else
return false;
#endif
diff --git a/utilities.h b/utilities.h
index 4247554..86b47dc 100644
--- a/utilities.h
+++ b/utilities.h
@@ -78,6 +78,8 @@ FRAMELESSHELPER_API void showSystemMenu(const WId winId, const QPointF &pos);
FRAMELESSHELPER_API void updateWindowFrameBorderColor(const WId winId, const bool dark);
FRAMELESSHELPER_API void fixupQtInternals(const WId winId);
[[nodiscard]] FRAMELESSHELPER_API bool isWindowFrameBorderVisible();
+[[nodiscard]] FRAMELESSHELPER_API bool isTitleBarColorized();
+[[nodiscard]] FRAMELESSHELPER_API bool isFrameBorderColorized();
#endif // Q_OS_WINDOWS
} // namespace Utilities
diff --git a/utilities_win32.cpp b/utilities_win32.cpp
index 38c2c2e..84592e4 100644
--- a/utilities_win32.cpp
+++ b/utilities_win32.cpp
@@ -241,8 +241,8 @@ void Utilities::updateWindowFrameMargins(const WId winId, const bool reset)
if (!winId) {
return;
}
- // DwmExtendFrameIntoClientArea() will always fail if DWM composition is disabled.
- // No need to try in this case.
+ // We can't extend the window frame when DWM composition is disabled.
+ // No need to try further in this case.
if (!isDwmCompositionEnabled()) {
return;
}
@@ -252,12 +252,9 @@ void Utilities::updateWindowFrameMargins(const WId winId, const bool reset)
if (!pDwmExtendFrameIntoClientArea) {
return;
}
- const MARGINS margins = [reset, winId]() -> MARGINS {
- if (reset) {
+ const MARGINS margins = [reset]() -> MARGINS {
+ if (reset || isWindowFrameBorderVisible()) {
return {0, 0, 0, 0};
- }
- if (isWindowFrameBorderVisible()) {
- return {0, static_cast(getTitleBarHeight(winId, true)), 0, 0};
} else {
return {1, 1, 1, 1};
}
@@ -367,7 +364,7 @@ bool Utilities::shouldAppsUseDarkMode()
DwmColorizationArea Utilities::getDwmColorizationArea()
{
- // It's a Win10 only feature.
+ // It's a Win10 only feature. (TO BE VERIFIED)
if (!isWin10OrGreater()) {
return DwmColorizationArea::None;
}
@@ -686,11 +683,12 @@ quint32 Utilities::getResizeBorderThickness(const WId winId, const bool horizont
if (!winId) {
return 0;
}
- const int paddedBorderWidth = getSystemMetrics2(winId, SM_CXPADDEDBORDER, true, scaled);
if (horizontal) {
- return (getSystemMetrics2(winId, SM_CXSIZEFRAME, true, scaled) + paddedBorderWidth);
+ return (getSystemMetrics2(winId, SM_CXSIZEFRAME, true, scaled)
+ + getSystemMetrics2(winId, SM_CXPADDEDBORDER, true, scaled));
} else {
- return (getSystemMetrics2(winId, SM_CYSIZEFRAME, false, scaled) + paddedBorderWidth);
+ return (getSystemMetrics2(winId, SM_CYSIZEFRAME, false, scaled)
+ + getSystemMetrics2(winId, SM_CYPADDEDBORDER, false, scaled));
}
}
@@ -750,11 +748,10 @@ QColor Utilities::getFrameBorderColor(const bool active)
}
const bool dark = shouldAppsUseDarkMode();
if (active) {
- const DwmColorizationArea area = getDwmColorizationArea();
- if ((area == DwmColorizationArea::TitleBar_WindowBorder) || (area == DwmColorizationArea::All)) {
+ if (isFrameBorderColorized()) {
return getDwmColorizationColor();
} else {
- return (dark ? QColor(QStringLiteral("#4d4d4d")) : QColor(Qt::white));
+ return (dark ? QColor(QStringLiteral("#4d4d4d")) : QColor(Qt::black));
}
} else {
return (dark ? QColor(QStringLiteral("#575959")) : QColor(QStringLiteral("#a6a6a6")));
@@ -771,29 +768,18 @@ void Utilities::updateWindowFrameBorderColor(const WId winId, const bool dark)
if (!isWin101809OrGreater()) {
return;
}
- static const auto pSetWindowTheme =
- reinterpret_cast(
- QSystemLibrary::resolve(QStringLiteral("uxtheme"), "SetWindowTheme"));
static const auto pDwmSetWindowAttribute =
reinterpret_cast(
QSystemLibrary::resolve(QStringLiteral("dwmapi"), "DwmSetWindowAttribute"));
- if (!pSetWindowTheme || !pDwmSetWindowAttribute) {
+ if (!pDwmSetWindowAttribute) {
return;
}
const auto hwnd = reinterpret_cast(winId);
const BOOL value = (dark ? TRUE : FALSE);
- HRESULT hr = pDwmSetWindowAttribute(hwnd, _DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1, &value, sizeof(value));
- if (FAILED(hr)) {
- // Just eat this error, because it only works on systems before Win10 20H1.
- }
- hr = pDwmSetWindowAttribute(hwnd, _DWMWA_USE_IMMERSIVE_DARK_MODE, &value, sizeof(value));
- if (FAILED(hr)) {
- // Eat this error, it only works on systems greater than or equal to Win10 20H1.
- }
- hr = pSetWindowTheme(hwnd, (dark ? L"DarkMode_Explorer" : L" "), nullptr);
- if (FAILED(hr)) {
- qWarning() << __getSystemErrorMessage(QStringLiteral("SetWindowTheme"), hr);
- }
+ // Whether dark window frame is available or not depends on the runtime system version,
+ // it's totally OK if it's not available, so just ignore the errors.
+ pDwmSetWindowAttribute(hwnd, _DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1, &value, sizeof(value));
+ pDwmSetWindowAttribute(hwnd, _DWMWA_USE_IMMERSIVE_DARK_MODE, &value, sizeof(value));
}
void Utilities::fixupQtInternals(const WId winId)
@@ -885,4 +871,19 @@ bool Utilities::isWindowFrameBorderVisible()
return result;
}
+bool Utilities::isTitleBarColorized()
+{
+ // CHECK: is it supported on win7?
+ if (!isWin10OrGreater()) {
+ return false;
+ }
+ const DwmColorizationArea area = getDwmColorizationArea();
+ return ((area == DwmColorizationArea::TitleBar_WindowBorder) || (area == DwmColorizationArea::All));
+}
+
+bool Utilities::isFrameBorderColorized()
+{
+ return isTitleBarColorized();
+}
+
FRAMELESSHELPER_END_NAMESPACE