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

时间:2010-10-07 18:08:28

标签: c++ c delphi winapi themes

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

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

As you can see on image

请参阅按钮作为示例。

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

5 个答案:

答案 0 :(得分:6)

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

编辑:简而言之,Windows需要知道应用程序是否打算使用新的样式控件。一些较旧的应用程序与XP及更高版本的新皮肤外观不兼容。因此,每个exe应声明它与清单中的兼容版本,可执行文件中的嵌入式xml文件。清单用于其他事情,例如声明你是什么或不兼容(DLL版本,120 dpi)以及免注册com。

答案 1 :(得分:2)

  1. 这取决于Delphi的版本 你正在使用。 IIRC预先Delphi 6你 需要添加所需的清单 手。 D7及更高版本有一个组件 需要在表单上删除 添加主题支持(它只是添加清单),直到D2007 IIRC 在项目中添加了一个简单的检查 选项。
  2. 早期版本的Delphi不会显示主题设计形式。您只会在运行时看到主题。
  3. 并非所有控件都支持主题。主题需要调用适当的绘制API,如果控件不符合,它将不是主题。标准网格是一个很好的例子,它不会在晚期版本之前绘制主题。

答案 2 :(得分:1)

如果您使用的是Delphi 2007或更高版本,Project>选项>申请>使用Windows需要检查主题。

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

答案 3 :(得分:0)

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

要使用Windows Theme API,您需要JwaUxTheme个JEDI API库。

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

一些好的参考资料:

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

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

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

答案 4 :(得分: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>
&#13;
&#13;
&#13;

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

&#13;
&#13;
mt.exe –manifest YourAppName.exe.manifest -outputresource:YourAppName.exe;1
&#13;
&#13;
&#13;