【问题标题】:Activate theme for a window if disabled system-wide如果在系统范围内禁用,则激活窗口的主题
【发布时间】: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 中使用的pszSubAppNamepszSubIdList 参数之间存在一对一的对应关系。 MS Docs 对此进行了扩展,仔细阅读 uxtheme.h 可能会提供更多见解。

标签: c++ windows winapi windows-themes


【解决方案1】:

如果用户决定禁用主题,您不能推翻该决定。你只需要应付它。显而易见的前进方式是在这种情况下改进应用程序的行为。

【讨论】:

  • 不完全正确,尝试禁用主题并启动谷歌浏览器。无论您选择什么,它都会从主题开始。
  • 我相信它自己完成了所有的渲染。我怀疑希望笼罩着判断力。
  • 很难说,我需要检查来源。现在我买不起一台像样的电脑,甚至在非圣经时代编译它。
  • Chrome 自己渲染。带有标签的标题栏不是 Windows 功能。 GUI 小部件都是 Chrome 特定的,而不是平台控件。
  • 但是它如何绘制 X 按钮的样式与我在系统上应用的样式相同(即使我涉足视障人士的颜色)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 2012-04-30
  • 2019-09-07
  • 2020-06-24
  • 1970-01-01
  • 2012-10-17
相关资源
最近更新 更多