如何让我的应用程序使用Windows主题?

4

我正在使用一些Windows API创建一个小程序。我已经创建了按钮、窗口,没问题。

但问题是我创建的组件看起来不像操作系统主题。它们看起来非常简单:

正如您在图像上看到的

以按钮为例。

如何启用Windows主题?可以使用C或Delphi实现。


你需要指定如何创建应用程序。你是使用Delphi VCL吗?还是在记事本中创建一个普通的C应用程序? - Andreas Rejbrand
我正在使用Delphi IDE进行编译,但我没有使用其中的任何文件。 这是我的源代码,http://gist.github.com/615680。 有3个文件,程序、uAPI、uMain,就这么简单。 - Rodrigo Farias Rezino
5个回答

6

针对使用Windows控件的应用程序,可以在此MSDN文章中找到相关文档。

编辑:简而言之,Windows需要知道应用程序是否打算使用新样式的控件。一些旧应用程序可能与XP及更高版本的新外观不兼容。因此,每个exe文件都应在嵌入式xml文件中声明其与哪个版本兼容的清单。该清单还用于其他事项,例如声明您与哪些内容兼容或不兼容(DLL版本、120 dpi),以及无需注册即可使用的组件。


我找不到在代码中实现它的方法。 我希望组件能够与 SO 主题相同,就像 Delphi IDE 创建时组件的行为一样。 - Rodrigo Farias Rezino
我不是Delphi专家。不过我在谷歌上找到了一篇关于Delphi和清单的文章:http://delphi.about.com/library/bluc/text/uc111601a.htm - user180326
2
只有微软才会将“选择加入”作为一个功能,以适应并使用标准外观 - jalf

3
  • 这取决于您使用的Delphi版本。如果记得没错,在Delphi 6之前的版本中,您需要手动添加所需的清单文件。D7及更高版本有一个组件,可以将主题支持添加到表单中(它只是添加了清单文件),直到D2007之前,该组件在项目选项中添加了一个简单的检查。
  • 早期版本的Delphi不会显示主题设计表单。您只能在运行时看到主题。
  • 并非所有控件都支持主题。主题需要调用适当的绘制API,如果控件不符合要求,则不会进行主题设置。标准网格是一个很好的例子,在较晚的版本中才进行主题绘制。

是的。我只想对第三点做一个备注。大多数 VCL 控件,如 TButtonTEditTListBox 等,只是 OS 控件的包装器,因此渲染是由 Windows 而不是 Delphi 代码完成的。这些控件可以很容易地按照正常方式进行主题设置。现在,一些 VCL 控件,如 TGrid,并不是本机 OS 控件,而是由 Delphi 代码绘制的。它们看起来会与开发人员所设计的完全一样。但是,可以使用 Windows API 或 ThemeServices 来查询当前主题的属性/绘制详细信息。因此,一些此类控件在某种程度上是“主题化”的,而大多数则不是。 - Andreas Rejbrand
在 D7 中,需要添加的组件是 TXPManifest。它位于 Win32 组件面板上。 - kol

1
如果您正在使用 Delphi 2007 或更高版本,则需要勾选“项目 > 选项 > 应用程序 > 使用 Windows 主题”。

(对于新应用程序,这应该会自动勾选)。


如果您正在使用标准的Windows控件(VCL是其包装器),那么它应该可以工作。 - Mike Sutton
您可以使用Win API的方式创建Windows控件,例如CreateWindow等。这就是TButtonTEdit等所做的事情。大多数VCL控件只是标准Windows控件的包装器。 - Andreas Rejbrand
如果您在运行时创建所有的VCL,则此选项不可用。 - Rodrigo Farias Rezino

0
在 MSDN 的 Visual Styles Reference: Functions 中,我发现了一个有趣的函数,即 SetWindowTheme()。它可以用于将视觉样式应用于控件/窗口或从其上移除,启用应用程序中的视觉样式需要完成几个步骤
要使用 Windows 主题 API,您需要 JEDI API 库的 JwaUxTheme 单元。
然而,从 Windows 主题文件(.theme)应用主题似乎必须通过关闭控件的视觉样式并编写基于来自 .theme 文件的信息的自绘制控件来完成。MSDN 有关于 .theme 文件规范的文档(请参见下面的第一个参考资料)。 一些好的参考资料:

Windows Presentation Foundation (WPF)主题不好吗?这里有一个加载它的代码示例here

如果您使用VCL,Theme EngineSkin Engine完全支持Windows XP的主题。

如果美观的应用程序是您的首要任务(不支持Windows主题),我认为BusinessSkinFormDynamicSkinForm是最佳选择。

我不打算使用其他皮肤,只想使用Windows标准皮肤,但是在使用VCL创建组件时,默认情况下它并没有设置。 - Rodrigo Farias Rezino
所以,您需要一种纯Windows API的方法来为您的应用程序应用主题。我进行了谷歌搜索,并找到了一个入门的轻量级方法。请查看我的编辑答案。 - Vantomex

0
如果您的可执行文件名为YourAppName.exe,则在可执行应用程序所在的同一目录中创建一个名为YourAppName.exe.manifest的清单文件。

YourAppName.exe.manifest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly
  xmlns="urn:schemas-microsoft-com:asm.v1"
  manifestVersion="1.0">
<assemblyIdentity
    name="YourAppName"
    processorArchitecture="*"
    version="1.0.0.0"
    type="win32"/>
<description>MyApp</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

将清单文件嵌入可执行文件中,请使用 mt.exe 命令行语法:

mt.exe –manifest YourAppName.exe.manifest -outputresource:YourAppName.exe;1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接