【发布时间】:2015-12-15 15:46:37
【问题描述】:
我正在面向 7、8 和 10 的 Windows 7 系统上编写 Windows(无 MFC 或 Qt)win32 应用程序。
我的应用检测是否启用了 Aero 并正确处理了 Aero 和非 aero,但是当操作系统中没有视觉样式(即“为窗口应用视觉样式和按钮”复选框在“控制面板”的“性能选项”对话框中处于关闭状态)。
我可以用IsAppThemed 检测我的应用程序是否在没有主题的情况下启动,但我似乎无法弄清楚如何直接创建启用样式的窗口或强制启用样式.. 这就是我试过了,还是不行:
case WM_CREATE: {
if (IsAppThemed() == FALSE) {
// No visual style is applied
SetThemeAppProperties(STAP_ALLOW_NONCLIENT | STAP_ALLOW_CONTROLS);
SendMessage(hWnd, WM_THEMECHANGED, 0, 0);
RedrawWindow(hWnd, 0, 0, RDW_UPDATENOW);
}
} break;
甚至没有
SetWindowTheme(hWnd, 0, 0);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
工作。
如果我检测到样式被禁用,如何强制启用它们?
【问题讨论】:
-
我认为只有在整个系统(Windows 7)关闭时,您才能为您的应用程序打开 Themes 系统服务。您必须尊重用户的选择 :) 但是我没有这方面的书面证据。
-
Aero 基本上从 Win8 中移除了。在 Win10(我认为是 Win8)中,
IsAppThemed始终是TRUE,但它总是显示无聊的方形边缘按钮。 -
如果主题关闭,它们就会关闭,并且大概是用户想要的那样。只需让您的应用在没有它们的情况下运行得更好。
-
在 W10 中,“性能选项”对话框中列出了 17 种视觉效果。不确定是否与SetWindowTheme 中使用的
pszSubAppName和pszSubIdList参数之间存在一对一的对应关系。 MS Docs 对此进行了扩展,仔细阅读 uxtheme.h 可能会提供更多见解。
标签: c++ windows winapi windows-themes