日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

[Win32] 窗体暗色模式, C++, WinForm, WPF 使用方法, 判断颜色模式, 响应颜色变更消息, 设置标题栏暗色.

發(fā)布時(shí)間:2024/1/8 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Win32] 窗体暗色模式, C++, WinForm, WPF 使用方法, 判断颜色模式, 响应颜色变更消息, 设置标题栏暗色. 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2023 年了, 如果咱寫的程序還不支持暗色模式, 那就說不過去了.

判斷是否是暗色模式

在 Windows 中判斷當(dāng)前系統(tǒng)的顏色模式是否是暗色, 可以通過查詢注冊表項(xiàng)來實(shí)現(xiàn).

下面是 C++ 的示例代碼:

HKEY hKey; const wchar_t* subKey = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; const wchar_t* valueName = L"AppsUseLightTheme"; DWORD value = -1; DWORD valueSize = sizeof(DWORD); if (RegOpenKeyEx(HKEY_CURRENT_USER, subKey, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {HRESULT hr = RegGetValue(hKey, nullptr, valueName, RRF_RT_REG_DWORD, nullptr, &value, &valueSize);if (hr != S_OK){value = -1; // 不要假定該鍵必須存在,如果找不到將返回默認(rèn)值}RegCloseKey(hKey); }if (value == 0) {// 當(dāng)前使用暗色主題 } else if (value == 1) {// 當(dāng)前使用亮色主題 } else {// 無法確定當(dāng)前主題 }

下面是 C# 示例代碼:

using Microsoft.Win32;RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize"); if (key != null) {int appsUseLightTheme = (int)key.GetValue("AppsUseLightTheme", -1);if (appsUseLightTheme == 0){// 當(dāng)前使用暗色主題}else if (appsUseLightTheme == 1){// 當(dāng)前使用亮色主題}else{// 無法確定當(dāng)前主題}key.Close(); }

設(shè)置窗口暗色模式

Windows 中自帶了一個(gè)暗色模式的 WinAPI, 直接調(diào)用就可以將窗口標(biāo)題欄變成暗色.

下面是 C++ 的示例代碼:

#include <windows.h> #include <dwmapi.h>int main() {HWND hWnd = GetMainWindowHandle(); // 獲取主窗口句柄DWORD dwAttribute = DWMWA_USE_IMMERSIVE_DARK_MODE; // 設(shè)置暗色模式屬性BOOL bValue = TRUE; // 啟用暗色模式DwmSetWindowAttribute(hWnd, dwAttribute, &bValue, sizeof(bValue)); // 設(shè)置窗口屬性return 0; }

下面是 C# 的示例代碼:

[DllImport("dwmapi.dll", PreserveSig = true)] public static extern int DwmSetWindowAttribute(IntPtr hwnd, DwmWindowAttribute attr, ref int attrValue, int attrSize);public static bool EnableDarkModeForWindow(IntPtr hWnd, bool enable) {int darkMode = enable ? 1 : 0;int hr = DwmSetWindowAttribute(hWnd, DwmWindowAttribute.UseImmersiveDarkMode, ref darkMode, sizeof(int));return hr >= 0; }public enum DwmWindowAttribute : uint {NCRenderingEnabled = 1,NCRenderingPolicy,TransitionsForceDisabled,AllowNCPaint,CaptionButtonBounds,NonClientRtlLayout,ForceIconicRepresentation,Flip3DPolicy,ExtendedFrameBounds,HasIconicBitmap,DisallowPeek,ExcludedFromPeek,Cloak,Cloaked,FreezeRepresentation,PassiveUpdateMode,UseHostBackdropBrush,UseImmersiveDarkMode = 20,WindowCornerPreference = 33,BorderColor,CaptionColor,TextColor,VisibleFrameBorderThickness,SystemBackdropType,Last }

響應(yīng)配色更改

當(dāng)系統(tǒng)配色更改的時(shí)候, 會(huì)向所有窗體發(fā)送一個(gè) THEMECHANGED 消息:

C++ 中, 你可以在 WndProc 捕捉這個(gè)消息, 然后進(jìn)行具體操作. 例如上面提到的, 設(shè)置窗口暗色模式.

#include <Windows.h> #include <iostream>LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);int main() {// 注冊窗口類WNDCLASS wc = {};wc.lpfnWndProc = WndProc;wc.hInstance = GetModuleHandle(NULL);wc.lpszClassName = L"MyWindowClass";if (!RegisterClass(&wc)) {std::cerr << "Failed to register window class" << std::endl;return 1;}// 創(chuàng)建窗口HWND hwnd = CreateWindow(L"MyWindowClass",L"My Window",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, GetModuleHandle(NULL), NULL);if (!hwnd) {std::cerr << "Failed to create window" << std::endl;return 1;}// 顯示窗口ShowWindow(hwnd, SW_SHOWDEFAULT);// 消息循環(huán)MSG msg;while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return 0; }LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg) {case WM_DESTROY:PostQuitMessage(0);return 0;case WM_THEMECHANGED:std::cout << "Theme changed" << std::endl;return 0;default:return DefWindowProc(hwnd, uMsg, wParam, lParam);} }

C# 的話, 如果你在使用 WinForm 或 WPF, 你可以直接使用 C# 封裝好的 SystemEvents 類, 它有一個(gè) UserPreferenceChanged 事件, 通過訂閱這個(gè)事件, 并判斷具體分類, 最后執(zhí)行操作:

SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;private void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e) {if (e.Category == UserPreferenceCategory.General){// 更新顏色主題} }

總結(jié)

以上是生活随笔為你收集整理的[Win32] 窗体暗色模式, C++, WinForm, WPF 使用方法, 判断颜色模式, 响应颜色变更消息, 设置标题栏暗色.的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。