From ed65bba7e375525cf63eabd0cb0a7fb04c18dc53 Mon Sep 17 00:00:00 2001 From: dreamsourcelabTAI Date: Fri, 19 Jan 2024 15:13:54 +0800 Subject: [PATCH] on windows, able to use dark style for native title --- DSView/pv/mainframe.cpp | 6 ++-- DSView/pv/mainwindow.cpp | 29 ++++++++++++++++++++ DSView/pv/mainwindow.h | 59 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 3 deletions(-) diff --git a/DSView/pv/mainframe.cpp b/DSView/pv/mainframe.cpp index a32d8fc3..285352cf 100644 --- a/DSView/pv/mainframe.cpp +++ b/DSView/pv/mainframe.cpp @@ -72,10 +72,10 @@ MainFrame::MainFrame() AppControl::Instance()->SetTopWindow(this); - #ifdef Q_OS_DARWIN - _is_native_title = false; + #ifdef _WIN32 + _is_native_title = true; #else - _is_native_title = true; + _is_native_title = false; #endif setMinimumWidth(MainWindow::Min_Width); diff --git a/DSView/pv/mainwindow.cpp b/DSView/pv/mainwindow.cpp index 76aef535..36b5a33b 100644 --- a/DSView/pv/mainwindow.cpp +++ b/DSView/pv/mainwindow.cpp @@ -117,6 +117,7 @@ namespace pv _frame = parent; assert(title_bar); + assert(_frame); _title_bar = title_bar; AppControl::Instance()->add_font_form(title_bar); @@ -1425,6 +1426,10 @@ namespace pv qApp->setStyleSheet(qss.readAll()); qss.close(); +#ifdef _WIN32 + setDark_Titlebar(reinterpret_cast(_frame->winId()), style == THEME_STYLE_DARK); +#endif + data_updated(); } @@ -2191,4 +2196,28 @@ namespace pv _view->update_all_trace_postion(); } +#ifdef _WIN32 + void MainWindow::setDark_Titlebar(HWND hwnd, bool isDarkStyle) + { + HMODULE hUxtheme = LoadLibraryExW(L"uxtheme.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32); + HMODULE hUser32 = GetModuleHandleW(L"user32.dll"); + fnAllowDarkModeForWindow AllowDarkModeForWindow + = reinterpret_cast(GetProcAddress(hUxtheme, MAKEINTRESOURCEA(133))); + fnSetPreferredAppMode SetPreferredAppMode + = reinterpret_cast(GetProcAddress(hUxtheme, MAKEINTRESOURCEA(135))); + fnSetWindowCompositionAttribute SetWindowCompositionAttribute + = reinterpret_cast(GetProcAddress(hUser32, "SetWindowCompositionAttribute")); + + SetPreferredAppMode(AllowDark); + BOOL dark = isDarkStyle; + AllowDarkModeForWindow(hwnd, dark); + WINDOWCOMPOSITIONATTRIBDATA data = { + WCA_USEDARKMODECOLORS, + &dark, + sizeof(dark) + }; + SetWindowCompositionAttribute(hwnd, &data); + } +#endif + } // namespace pv diff --git a/DSView/pv/mainwindow.h b/DSView/pv/mainwindow.h index 6d28b65c..a7d01e46 100644 --- a/DSView/pv/mainwindow.h +++ b/DSView/pv/mainwindow.h @@ -34,6 +34,61 @@ #include #include "dstimer.h" +#ifdef _WIN32 +#include +#include +#pragma comment (lib, "Dwmapi.lib") + +enum PreferredAppMode { + Default, + AllowDark, + ForceDark, + ForceLight, + Max +}; + +enum WINDOWCOMPOSITIONATTRIB { + WCA_UNDEFINED = 0, + WCA_NCRENDERING_ENABLED = 1, + WCA_NCRENDERING_POLICY = 2, + WCA_TRANSITIONS_FORCEDISABLED = 3, + WCA_ALLOW_NCPAINT = 4, + WCA_CAPTION_BUTTON_BOUNDS = 5, + WCA_NONCLIENT_RTL_LAYOUT = 6, + WCA_FORCE_ICONIC_REPRESENTATION = 7, + WCA_EXTENDED_FRAME_BOUNDS = 8, + WCA_HAS_ICONIC_BITMAP = 9, + WCA_THEME_ATTRIBUTES = 10, + WCA_NCRENDERING_EXILED = 11, + WCA_NCADORNMENTINFO = 12, + WCA_EXCLUDED_FROM_LIVEPREVIEW = 13, + WCA_VIDEO_OVERLAY_ACTIVE = 14, + WCA_FORCE_ACTIVEWINDOW_APPEARANCE = 15, + WCA_DISALLOW_PEEK = 16, + WCA_CLOAK = 17, + WCA_CLOAKED = 18, + WCA_ACCENT_POLICY = 19, + WCA_FREEZE_REPRESENTATION = 20, + WCA_EVER_UNCLOAKED = 21, + WCA_VISUAL_OWNER = 22, + WCA_HOLOGRAPHIC = 23, + WCA_EXCLUDED_FROM_DDA = 24, + WCA_PASSIVEUPDATEMODE = 25, + WCA_USEDARKMODECOLORS = 26, + WCA_LAST = 27 +}; + +struct WINDOWCOMPOSITIONATTRIBDATA { + WINDOWCOMPOSITIONATTRIB Attrib; + PVOID pvData; + SIZE_T cbData; +}; + +using fnAllowDarkModeForWindow = BOOL (WINAPI *)(HWND hWnd, BOOL allow); +using fnSetPreferredAppMode = PreferredAppMode (WINAPI *)(PreferredAppMode appMode); +using fnSetWindowCompositionAttribute = BOOL (WINAPI *)(HWND hwnd, WINDOWCOMPOSITIONATTRIBDATA *); +#endif + class QAction; class QMenuBar; class QMenu; @@ -157,6 +212,10 @@ private: QJsonArray get_decoder_json_from_data_file(QString file, bool &bSucesss); void check_config_file_version(); void load_demo_decoder_config(QString optname); + +#ifdef _WIN32 + static void setDark_Titlebar(HWND hwnd, bool isDarkStyle); +#endif private: //ISessionCallback