Apparently, the latest Windows has a Win32 API now for 'Dark' mode:
Could support for this be added to PureBasic?
Windows 'Dark' mode.
- DoubleDutch
- Addict
- Posts: 3219
- Joined: Thu Aug 07, 2003 7:01 pm
- Location: United Kingdom
- Contact:
Windows 'Dark' mode.
Last edited by DoubleDutch on Mon Sep 28, 2020 6:57 am, edited 1 time in total.
https://deluxepixel.com <- My Business website
https://reportcomplete.com <- School end of term reports system
https://reportcomplete.com <- School end of term reports system
- DoubleDutch
- Addict
- Posts: 3219
- Joined: Thu Aug 07, 2003 7:01 pm
- Location: United Kingdom
- Contact:
Re: Windows 'Dark' mode.
It looks like they have settled on a new win32 API call called 'setWindowCompositionAttribute'.
Here is what Microsoft' bash terminal uses to use dark mode:
Here is what Microsoft' bash terminal uses to use dark mode:
Code: Select all
diff --git a/src/winmain.c b/src/winmain.c
index 0672f94..4544a12 100644
--- a/src/winmain.c
+++ b/src/winmain.c
@@ -186,7 +186,13 @@ trace_winsize(char * tag)
static HRESULT (WINAPI * pDwmIsCompositionEnabled)(BOOL *) = 0;
static HRESULT (WINAPI * pDwmExtendFrameIntoClientArea)(HWND, const MARGINS *) = 0;
static HRESULT (WINAPI * pDwmEnableBlurBehindWindow)(HWND, void *) = 0;
+static HRESULT (WINAPI * pDwmSetWindowAttribute)(HWND, DWORD, LPCVOID, DWORD) = 0;
+
static HRESULT (WINAPI * pSetWindowCompositionAttribute)(HWND, void *) = 0;
+static BOOL (WINAPI * pSystemParametersInfoA)(UINT, UINT, PVOID, UINT) = 0;
+
+static BOOLEAN (WINAPI * pShouldAppsUseDarkMode)(void) = 0;
+static HRESULT (WINAPI * pSetWindowTheme)(HWND, const wchar_t *, const wchar_t *) = 0;
// Helper for loading a system library. Using LoadLibrary() directly is insecure
// because Windows might be searching the current working directory first.
@@ -209,6 +215,8 @@ load_dwm_funcs(void)
{
HMODULE dwm = load_sys_library("dwmapi.dll");
HMODULE user32 = load_sys_library("user32.dll");
+ HMODULE uxtheme = load_sys_library("uxtheme.dll");
+
if (dwm) {
pDwmIsCompositionEnabled =
(void *)GetProcAddress(dwm, "DwmIsCompositionEnabled");
@@ -216,10 +224,20 @@ load_dwm_funcs(void)
(void *)GetProcAddress(dwm, "DwmExtendFrameIntoClientArea");
pDwmEnableBlurBehindWindow =
(void *)GetProcAddress(dwm, "DwmEnableBlurBehindWindow");
+ pDwmSetWindowAttribute =
+ (void *)GetProcAddress(dwm, "DwmSetWindowAttribute");
}
if (user32) {
pSetWindowCompositionAttribute =
(void *)GetProcAddress(user32, "SetWindowCompositionAttribute");
+ pSystemParametersInfoA =
+ (void *)GetProcAddress(user32, "SystemParametersInfoA");
+ }
+ if (uxtheme) {
+ pShouldAppsUseDarkMode =
+ (void *)GetProcAddress(uxtheme, MAKEINTRESOURCEA(132)); /* ordinal */
+ pSetWindowTheme =
+ (void *)GetProcAddress(uxtheme, "SetWindowTheme");
}
}
@@ -4782,6 +4800,26 @@ main(int argc, char *argv[])
x, y, width, height,
null, null, inst, null);
trace_winsize("createwindow");
+
+ // Dark mode support
+ if (pShouldAppsUseDarkMode) {
+ HIGHCONTRAST hc = { 0 };
+ hc.cbSize = sizeof hc;
+ pSystemParametersInfoA(SPI_GETHIGHCONTRAST, sizeof hc, &hc, 0);
+
+ if (!(hc.dwFlags & HCF_HIGHCONTRASTON) && pShouldAppsUseDarkMode()) {
+ pSetWindowTheme(wnd, L"DarkMode_Explorer", NULL);
+ BOOL dark = 1;
+
+#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE
+#define DWMWA_USE_IMMERSIVE_DARK_MODE 19
+#endif
+
+ pDwmSetWindowAttribute(wnd, DWMWA_USE_IMMERSIVE_DARK_MODE,
+ &dark, sizeof dark);
+ }
+ }
+
// Workaround for failing title parameter:
if (pEnableNonClientDpiScaling)
SetWindowTextW(wnd, wtitle);
https://deluxepixel.com <- My Business website
https://reportcomplete.com <- School end of term reports system
https://reportcomplete.com <- School end of term reports system
Re: Windows 'Dark' mode.
Et cetera is my worst enemy