介绍
当
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 inAmes, 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#).