【问题标题】:Apply a custom Visual Style (.msstyle) to a single Winforms app将自定义视觉样式 (.msstyle) 应用到单个 Winforms 应用程序
【发布时间】:2011-03-30 19:42:46
【问题描述】:

有什么方法可以在不改变整个系统主题的情况下将自定义视觉样式 (.msstyle) 应用于 Windows 窗体应用程序?基本上,我们希望我们的应用程序保持相同的主题,无论在控制面板中设置了什么。请不要告诉我你是否认为这是个好主意。我想知道是否有任何不涉及专有库的方法来执行此操作,例如一系列本机 API 调用。谢谢!

【问题讨论】:

  • 您的问题解决了吗?我也需要这个
  • @ThiagoSuchorski 我回答了为什么这可能不是一个好主意。希望能给大家一些指导。

标签: winforms visual-styles msstyles


【解决方案1】:

SetWindowTheme 函数看起来像您正在寻找的解决方案。您必须执行 P/Invoke 才能使用它。

【讨论】:

  • 我找到了 SetWindowTheme,但我不认为它符合我的要求。此功能似乎只允许我更改窗口的类以进行样式设置。据我所知,我认为它实际上不允许我指定一个完全不同的 .msstyles 文件的路径。
  • 我可以通过将一个空字符串传递给窗口类的该函数来强制它根本不使用样式(AKA Windows Classic),但这也不是我想要的。
  • 我接受了这个答案,即使它没有回答我的问题,因为我尝试过人们不接受这里的答案。事实上,这个要求非常荒谬。我很确定只能通过非常复杂的 Windows API 调用拦截来完成,基本上是重新实现样式库处理代码。
  • @luksan:既然这个问题没有得到真正的回答,我认为你有理由不接受它;我敢肯定,这里的任何问题都不是由于人们理性地决定是否接受一个解决方案以及哪个解决方案。无论如何,谢谢你的想法。
【解决方案2】:

遗憾的是,这需要大量挂钩,而不仅仅是简单的 P/Invoke。

使用托管代码覆盖/创建新控件可能会更快更好。否则,您将需要在本机 DLL 的帮助下挂钩主题调用,并且在操作时要非常小心。

实际上,恐怕我自己也不知道如何实现它。那时我会给出一个更有帮助的答案。通过查看 Style Soft(该公司似乎自 2014 年以来似乎已死)的现已废弃的工具“VisualStyler”的代码,整个进展似乎过于复杂,该工具很好地支持了所有这些。

另外,如果你真的决定使用 uxtheme,你会被 Windows 主题引擎提供的东西所束缚,仅限于它的视觉样式文件格式和小技巧(你现在甚至有一个好的编辑器吗?)。

我希望微软在为 XP 创建主题引擎时能做到一针见血,允许应用程序开发人员将其用于他们自己的应用程序标识。但在主题/Windows 产品标识方面,他们似乎从来没有这样做过(另一个例子是 DWM 没有公开任何 3D 转换功能,但防止应用程序通过滥用这些东西来做疯狂的事情可能是个好主意)。

选项?

  • 在托管代码中创建自己的控件,自己处理绘图。
  • 购买适用于 Win32 应用程序的产品。
  • 开始使用 WPF,它提供了现代而合理的方法来创建应用程序主题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多