【问题标题】:How do I make my application use the Windows theme?如何让我的应用程序使用 Windows 主题?
【发布时间】:2010-10-07 18:08:28
【问题描述】:

我正在使用一些 Windows API 来创建一个小应用程序。 按钮、窗口我已经创建好了。

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

以按钮为例。

如何启用 Windows 主题?它可以是 C 或 Delphi。

【问题讨论】:

  • 您需要指定如何创建应用程序。你在使用德尔福 VCL 吗?您是在记事本中创建纯 C 应用程序吗?
  • 我正在使用 Delphi IDE,只是为了编译,但我没有使用其中的任何文件。这是我的源代码gist.github.com/615680。就是3个文件,程序,uAPI,uMain,就这么简单。

标签: c++ c delphi winapi themes


【解决方案1】:

对于使用 Windows 控件的应用程序,在 this msdn article 中有记录

编辑:长话短说,Windows 需要知道应用程序是否打算使用新样式控件。一些较旧的应用程序与 XP 及更高版本的新外观外观不兼容。因此,每个 exe 都应在清单中声明它与哪个版本兼容,即可执行文件中的嵌入 xml 文件。清单用于其他用途,例如声明您与什么兼容或不兼容(DLL 版本,120 dpi)以及免注册 com.

【讨论】:

  • 我找不到在代码上实现它的方法。我希望组件作为 SO 的主题,这与 Delphi IDE 创建组件时的行为相同。
  • 我不是德尔福专家。我在谷歌上搜索了一篇关于 delph 和 manifests 的文章:delphi.about.com/library/bluc/text/uc111601a.htm
  • 只有 Microsoft 才会将其设为“选择加入”功能以适应并使用标准外观
【解决方案2】:
  1. 这取决于什么版本的Delphi 你正在使用。 IIRC pre-Delphi 6 你 需要通过添加所需的清单 手。 D7 及更高版本有一个组件 需要放在表格上 添加主题支持(它只是添加清单),直到 D2007 IIRC 在项目中添加了一个简单的检查 选项。
  2. 早期版本的 Delphi 不会显示主题设计形式。您只会在运行时看到主题。
  3. 并非所有控件都支持主题。主题需要调用适当的绘图 API,如果控件不符合要求,则不会进行主题化。标准网格就是一个很好的例子,它直到最新版本才以绘图为主题。

【讨论】:

  • 是的。我只想谈谈第三点。大多数 VCL 控件,例如TButtonTEditTListBox 等都是 OS 控件的简单包装,因此,渲染是由 Windows 完成的,而不是由 Delphi 代码完成的。这些很容易以正常方式主题化。现在,一些VCL控件,比如TGrid,不是原生的OS控件,而是由Delphi代码绘制的。这些看起来与开发人员让它们看起来完全一样。可以使用 Windows API 或ThemeServices 来查询当前的属性/绘制详细信息。主题,虽然。因此,某些此类控件在某种意义上是“主题”,而大多数不是。
  • 在 D7 中,必须添加的组件是TXPManifest。它位于Win32 组件面板上。
【解决方案3】:

如果您使用的是 Delphi 2007 或更高版本,则需要选中 Project > Options > Application > Use Windows Themes。

(应自动检查新应用程序)。

【讨论】:

  • 如果你使用标准的 Windows 控件(VCL 是一个包装器),它应该可以工作。
  • 您可以通过 Win API 方式创建一个 Windows 控件,使用 CreateWindow 等。这就是 TButtonTEdit 等所做的。大多数 VCL 控件只是标准 Windows 控件的包装器。
  • 如果您在运行时创建所有 vcl,则此选项不可用。
【解决方案4】:

在MSDN的Visual Styles Reference: Functions,我发现了一个有趣的函数,就是SetWindowTheme()。它可用于向/从控件/窗口应用或删除视觉样式,需要完成several steps 才能在应用程序中启用视觉样式。

要使用 Windows Theme api,您需要 JEDI API 库的JwaUxTheme 单元。

但是,将 Windows 主题文件 (.theme) 中的主题应用到应用程序似乎必须通过关闭控件的视觉样式并根据来自 .theme 文件的信息编写所有者绘制的控件来完成。 MSDN 有一个关于.theme 文件规范的文档(参见下面的第一个参考)。

一些很好的参考资料:

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

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

如果您优先考虑美容应用(不支持 Windows 主题),我认为BusinessSkinFormDynamicSkinForm 是最佳选择。

【讨论】:

  • 我不打算使用其他皮肤,只使用Windows标准,但是通过VCL创建组件时默认没有设置。
  • 因此,您需要一种纯 Windows API 方式将主题应用到您的应用程序。我已经进行了谷歌搜索,并找到了开始进入它的灯。请参阅我编辑的答案。
【解决方案5】:

如果您的可执行文件名为 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    相关资源
    最近更新 更多