给.NET下的Windows窗体程序加载Xp样式

史宸
2023-12-01

转帖地址:http://blog.csdn.net/zhzuo/archive/2004/04/22/22030.aspx

介绍  

 

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#).

 类似资料: