给.NET中的Windows窗体加载Xp样式

作者:Mark Strawmyer

介绍

当Windows XP 带着他特有的可视化样式或者主题发布时,许多人为他拥有的华丽界面而兴奋。然而,当.NET1.0正式版本发布的时候,许多人包括我自己为Windows 窗体不支持Windows XP 的可视化样式而失望。我对可视化样式的API函数和微软的.NET框架开发文档进行了一番研究,而后认识到为.NET应用程序加上Xp样式也不是很难。

下面的将通过一个简单的程序来为你的程序和控件加上Xp样式。内容适用于一些拥有能实现Xp样式的属性的控件,通过这些属性使他们产生Xp样式,同时通知Windows系统为你的应用程序和控件加上主题。

实现所需条件

你需要一些条件来实现这项功能:

  1. Microsoft .NET Framework SDK(必须)
  2. Microsoft Visual Studio .NET,他帮助你设计Windows窗体(可选)
  3. Windows XP 操作系统(可选),支持主题的正式版本操作系统

进入正题

打开Visual Studio .NET 建立一个新的Windows 应用程序。在这里我将使用C#来作为编程语言,因此如果你使用Visual Basic.NET,你就需要转换代码。

当你建好项目后,打开AssemblyInfo.cs文件,在AssemblyTitle,AssemblyDescription以及AssemblyVersion中填入值,修改AssemblyDelaySign的值为true。

同时你也要修改AssemblyKeyFile的值为@”....\KeyFile.snk”,KeyFile.snk文件我们随后回来创建或者拷贝一个。

当你按照上面所说的完成后,你的代码看起来应该象下面:

using System.Reflection;
using System.Runtime.CompilerServices;

[assembly: AssemblyTitle("Theme Test")]
[assembly: AssemblyDescription("Testing Windows XP Visual Styles.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyDelaySign(true)]
[assembly: AssemblyKeyFile(@"..\..\KeyFile.snk")]
[assembly: AssemblyKeyName("")]

现在,打开Form1.cs窗体设计界面加一些Windows窗体控件到上面,比如ListViews,Buttons,GroupBoxes,ProgressBars或者更多,下面列出了所有支持Xp样式的孔件:

TextBox
RichTextBox
HScrollBar
VScrollBar
ProgressBar
TabControl
MainMenu
ContextMenu
ComboBox
DataGrid
ListBox
ListView
TreeView
DateTimePicker
MonthCalendar
Splitter
TrackBar
StatusBar
ToolBar
TreeView
ListView

对于这些控件,有些是默认就支持的,另外的一些特定的控件是从ButtonBase,GroupBox,或者Label继承而来,你需要设置他们的FlatStyle属性为System,那些我会做一些简短的说明。

当你编译这个应用程序后,你会发现这个Windows Forms看上去不象带有Xp样式,要找到原因,请往下看。

Windows Xp样式的显示原理

简单描述:Comctl32.dll,版本为6。Comctl32.dll,或者那些普通控件使用了很长时间。这个动态连接库被基础控件使用,同时User32.Dll提供给用户控件。在版本6的Comctl32.dll中,所有的控件都放入在里面,因此他们都支持主题。

但是新版本的Comctl32.dll不象上一个版本,要使用Windows XP样式,你必须使用包含有Comctl32.dll的操作系统,比如Windows XP。

对于那些被支持的控件,他们的样式是同一些特殊的主题资源相关的,而这些就是用来在客户界面进行绘制。对于那些派生于ButtonBase,GroupBox和Lablel的控件必须把FlatStyle属性设置成FlatStyle.System枚举值,这样系统就可以对他们进行绘制。

为了使操作系统给我们的控件加主题样式,你需要通知系统让版本6的Comctl32.dll作为默认。系统默认的使用的是版本5的Comctl32.dll,对于.NET的程序也是如此,但是我们会让程序在执行时使用版本6的Comctl32.dll。

给你的项目增加一个XML文件,文件命取为[你的应用程序名].exe.manifest,[你的应用程序名]指得就是项目编译生成的主exe文件。设置编译类型为”None”。

假如你的AssemblyInfo.cs中的代码就是上面提到的那样,那么新建的[你的应用程序名].exe.manifest文件应该为下面的样子:

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

你要适当的替换上面的”version”和”name”属性的值,使他和你项目里面的一样,分别对应AssemblyVersion和AssemblyTitle属性。那个”descryiption”元素也要同你的AssemblyDescription属性符合。

接下去,打开命令提示窗口修改你的项目输出路径,应该把”bin\Debug”作为项目路径根目录。假设你已经加了sn.exe强名称工具的路径到你的系统环境变量,那么在命令行中输入如下:

sn.exe –k ..\..\KeyFile.snk

上面的步骤会生成一个KeyFile.snk公钥文件,为了使你的程序集成为强类型程序集这个公钥是必须的。这个在许多情况下是必须需的。

最后一步添加Mnifest信息

你现在要在项目文件输出的所在目录。在我的例子中是一个简单的WindowsApplication1.exe文件,接下去会讲到他。

现在,退回到Visul Studio.NET,点击文件菜单—>打开,浏览到你的应用程序比如WindowsApplication1.exe,点击打开他我们会看到一个资源文件管理树。

  1. 右键在根节点上点击选择“添加资源”。
  2. 点击“导入”按钮,在你的项目路径中找到WindowsApplication.exe.mnifest并打开他。
  3. 在自定义资源类型对话框中我们输入 RT_MANIFEST 然后点击确定。
  4. 保存所有文件让我们回到先前的资源来浏览树。我们现在可以看到一个RT_MANIFEST的节点。
  5. 点击选中他下面那个新加的资源文件,通常的名字是101。在属性窗口里修改他的ID值为1,再一次保存你的应用程序。
  6. 关闭你打开的资源浏览窗口回到命令行提示符下,输入下面的命令:

sn –R WindowsApplication1.exe ..\..\KeyFile.snk

执行后会输出一些版本信息,最后显示:

Assembly ‘WindowsApplication1.exe’ successfully re-signed

运行你的.NET应用程序你就会看到Windows XP样式了。

概要

你不需要做很多工作就可以把Windows XP 可视化样式加入到你的应用程序和控件。使用这些新的样式将会带给你的窗体新的视觉,而这些经常在商业程序上用到。许多公司都花精力去开发这方面的东西,而现在你可以不用做很多工作就可以做到。

请记住把那些带有FlatStyle属性的控件设置为FlatStyle.System,同时在编译你的程序后加入manifest资源就象上面的样板文件。当这些都做好了以后剩下的就是完成对程序集的签名。如果你想要测试你的应用程序或者你有权限对他进行签名,你可以通过下面的命令关闭对程序集的验证:

sn.exe –Vr WindowsApplication1.exe

立即行动,为你的应用程序加上Xp样式,使你的产品更有特点。这样做不会花很多时间但是效果是显而易见的。

About Heath Stewart

Heath Stewart is a happily married software engineer originally from Nebraska and a graduate of Iowa State University in Ames, Iowa. With nothing much to do in either state, Heath started programming early in life when gopher ruled and the Internet wasn't commercialized, and enjoys continuous research and development in new languages and frameworks. Fluent in many different programming languages, he has developed many large software solutions for companies in different areas, such as Internet filtering, intrusion detection systems, production management systems, Web sites for various purposes, and data analysis tools. He also enjoys photography.

Currently, Heath is the Director of Technology at Proplanner, a Web-based Production Planning System that primarily uses .NET where he designed a multi-tiered environment and supports multiple front-ends (such as a legacy Java interface on PDM) and back-ends (such as Web Services, RDBMS's, file-based IO, and PDM).

Heath is now an editor for CodeProject and is happy to help the development community as a Microsoft MVP (C#).

Contributors: FHL