CSDN博客

img PeterPlus

在.NET程序的窗体中使用XP风格的控件

发表于2004/10/11 11:25:00  1099人阅读

在 .NET 程序的窗体中使用 XP 风格的控件

在 .NET 程序的窗体中使用 XP 风格的控件

原著:微软 Visual Studio 团队的 Seth Grossman,2002 年 2 月

 

摘要

  Windows XP 中引入了一套新的用户界面效果。与 Visual Studio .NET 中生成的控件相比,Windows XP 用户界面更新奇更好看的显示效果。控件是圆角的,当鼠标指针移上去时会呈现出发光效果;还有非常漂亮的进度条控件……这些都是 Windows XP 引入的增强效果。

  问题是,很多 Visual Studio 开发人员会问:“我该如何在自己设计的应用程序中使用这些非常酷的效果?”解决方法是在你的应用程序中添加一些新的引用和资源文件。这篇文章将告诉你如何把 Windows XP 的显示效果加入你用 Visual Basic 或者 Visual C# 编写的窗口应用程序中,并以一个简单的程序来加以说明。

注意:这篇文章描述的界面效果仅应用于 Windows XP 中运行的应用程序。

 

目录

介绍
了解新界面
Manifest 使之生效
为控件添加显示风格
漂亮的新界面
剩下的步骤
小结

 

介绍

在 Microsoft® Windows® XP 以非常漂亮的新界面显示控件

图 1

Microsoft Visual Studio® 开发的控件,虽然都是一样的控件,但与之对比,并没有这些漂亮的外观。

图 2

  这篇文章将会告诉大家如何让 Visual Studio 控件看起来也像 Windows XP 控件那样漂亮。

  一个窗体明显由两部分组成:客户区和非客户区。所有运行于 Windows XP 操作系统的应用程序都有非客户区,这部分包括窗口的边框、标题栏和非客户区的滚动条。操作系统会默认地将可视风格应用于非客户区,所以,即使不进行下面要讲述的操作,当窗体在 Windows XP 下运行时你也会看到新可视风格的标题栏和滚动条。这篇文章描述如何将新可视风格应用于客户区。

 

了解新界面

  非客户区的外观由普通的可视风格指定,这个可视风格可以是操作系统的,也可以由用户在应用程序中修改。我们已经提到过,窗体在 Windows XP 中运行时,滚动条和标题栏的外观会马上改变为 Windows XP 风格的。如果让应用程序使用版本号为 6.0 的 Comctl32.dll,一些 Windows 窗体的控件将会呈现出新的外观。

  当应用程序使用 Comctl32.dll 6.0 的时候,下列控件会使用新界面风格:

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

  其它控件需要更多的设置。所有从 System.Windows.Forms.ButtonBase 类继承的控件(Button, RadioButton, GroupBox 和 CheckBox 控件) 都有一个名为 FlatStyle 的属性,用来指示如何绘制该控件。这个属性的值是 FlatStyle 枚举类型,它允许以下列几种方法来绘制控件:

    枚举成员 说  明
    Flat 控件以平面风格显示
    Popup 控件以平面风格显示,鼠标指针移到该控件上方时,控件以立体风格显示
    Standard 控件以立体风格显示
    System 控件的显示风格由用户的操作系统决定

  由上述说明可以看出,当 FlatStyle 属性设置为 System 枚举值的时候,控件的外观由用户的操作系统决定。这样的设置能使控件按 Windows XP 的风格绘制。

  可以通过改变 FlatStyle 属性来改变可视风格的控件有:

  • Button 控件
  • RadioButton 控件
  • CheckBox 控件
  • GroupBox 控件

  最后,一些 Windows 窗体的控件在 Windows XP 中看起来和在 Visual Studio 中一样。

  显示风格没有改变的控件有:

Controls whose visual style does not change

  • Label 控件
  • LinkLabel 控件
  • DomainUpDown 控件
  • NumericUpDown 控件
  • CheckedListBox 控件

 

Manifest 使之生效

  想让应用程序使用新的外观,还必须添加一个应用程序的 manifest 清单文件(一个在创建应用程序过程中指定必要资源的文件)。如果 Comctl32.dll 6.0 可用,该文件将指示应用程序使用它。Comctl32.dll 6.0 包含一些新的控件和其它控件的一些新的特性。它与以前版本最大的区别就是支持改变控件在窗口中的外观。

  6.0 版本的 Comctl32.dll 不像其它版本的那样有单独发布。要使用 6.0 版本的这个动态链接库(DLL, Dynamic Link Library),唯一的办法是使用包含该动态链接库的操作系统。Windows XP 中装有 5.0 版本和 6.0 版本,在默认情况下,应用程序使用 Comctl32.dll 5.0 中定义的普通控件(用户控件定义在 User32.dll)。Comctl32.dll 6.0 包含用户控件和普通控件,将该 DLL 连入应用程序可以将 Windows XP 的显示风格应用于控件。

  为了让应用程序在用户的计算机上很好的兼容于操作系统,下面要建立的应用程序使用一个 manifest 清单文件明确指定 Windows 窗体使用使用 Comctl32.dll 6.0 中定义的控件。manifest 文件是以 XML 格式保存的,可以作为资源文件编译在应用程序中,也可以作为单独的文件放在应用程序所在的目录下。

  综上所述,为了使用 Windows XP 显示风格的控件,你必须:

  • 对于含有 FlatStyle 属性的控件,设置其值为 FlatStyle.System。
  • 创建一个 manifest 清单文件以绑定 Comctl32.dll 6.0 到应用程序。下面的 manifest 文件示例可以将 Comctl32.dll 6.0 绑定到 Visual Studio .NET 应用程序。
  • 将这个资源(manifest) 加入应用程序文件并重新生成应用程序

为控件添加显示风格

  学习使用 Windows XP 风格最简单宜行的办法是试着做一个例子。

  下面,你要做这些事情:

  • 创建一个 Windows 应用程序项目,并且在其中添加一些控件。
  • 创建一个 manifest 文件以绑定你的应用程序和提供 Windows XP 外观的 DLL 文件。
  • 将 manifest 移动到应用程序可执行文件所在的目录
  • 将资源(manifest)添加到可执行文件中

  下面开始第一步,创建一个 Windows 应用程序项目

·创建项目
 创建一个项目,并且在其中放置一些控件

  1. 创建一个 Windows 应用程序项目。关于这一步的具体操作,请参考其它文档。

   注意:请记下项目名称和该项目保存的目录,这在后面的操作中非常重要。

  2. 从工具箱中将下载控件加入你的应用项目:

  • Button 控件
  • RadioButton 控件
  • ProgressBar 控件
  • CheckBox 控件
  • Label 控件

  注意:Label 控件不会有新的外观。前在有提及哪些控件会直接显示新外观,哪些需要设置 FlatStyle 属性以及哪些不会改变外观。

  3. 双击 Button 控件将为其添加一个 Click 事件句柄,同时代码编辑窗口中输入点会定位在该事件函数中。

  4. 写入如下代码以设置 ProgressBar 控件的值,以便在运行时可以看到进度条的新外观。

' Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
    ProgressBar1.Value = 50
End Sub
// C#
private void button1_Click(object sender, System.EventArgs e)
{
    progressBar1.Value = 50;
}

  5. 从“生成”菜单中选择“生成解决方案”。

  6. 从“文件”菜单中选择“保存所有”。

·创建和编辑 manifest 文件
 创建 XML 格式的 manifest 文件绑定应用程序和正确版本的 Comctl32.dll

  1. 在解决方案管理器中,右键单击工程名。在弹出菜单中选择添加->新项。

  2. 在添加新项的对话框中进行如下操作:

    • 在左边的类别窗格里,选择“本地项目项”。
    • 在右边的模板窗格里,选择文本文件。
    • 在名称框里输入按这种规则命名的文件名:<可执行程序名>.exe.manifest。也就是说,如果应用程序叫 MyXPApp,就应该给这个 XML 的 manifest 文件命名为 MyXPApp.exe.manifest。

  3. 点击打开按钮,创建 manifest 文件,并关闭对话框。
    编辑器中将打开刚才建立的空文本文件。

  4. 在文本文件中添加如下 XML 代码:

<?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="Microsoft.Winweb.<Executable Name>"
   type="win32"
/>
<description>.NET control deployment tool</description>
<dependency>
   <dependentAssembly>
     <assemblyIdentity
       type="win32"
       name="Microsoft.Windows.Common-Controls"
       version="6.0.0.0"
       processorArchitecture="X86"
       publicKeyToken="6595b64144ccf1df"
       language="*"
     />
   </dependentAssembly>
</dependency>
</assembly>
提示:粘贴的时候如果 < 和 > 被换成了 &lt; 和 &gt;,先删除粘帖的内容,然后右键单击编辑器,并在弹出菜中中选择粘贴 HTML。如果此示不能成功,请先将内容粘贴进一个文本编辑器,如记事本,再从文本编辑器中重新拷贝,再粘贴到 Visual Studio 的编辑器中。

  5. 在粘贴出来的文本中,把 <Executable Name> 换成你的可执行文件的名字,就像在第 2 步中做的那样。

  6. 从“生成”菜单中,选择“生成解决方案”。

  7. 在“文件”菜单中选择“保存所有”,以保存 manifest 文件。

·移动 manifest 文件到可执行文件所在的目录
 将刚创建的 manifest 文件从默认位置拷贝到可执行应用程序文件所在的目录

  1. 在 Windows 的资源管理器中,找到保存 Visual Studio 解决方案的目录,这个目录是在“创建工程”一步中设置的。

  2. 在这个目录中,找到刚才创建的 manifest 文件(它的名字是 <Executable Name>.exe.manifest)。

  3. 点击这个文件以选中它,从编译菜单中选择复制。

  4. 现在打开解决方案的保存目录下的 Bin 目录,进入 Debug 目录或者 Release 目录(由创建选项设置了编译结果保存在哪个目录)。这个目录中应该有生成的可执行应用程序文件(应用程序名应该是 <Excutable Name>.exe)。

·往可执行文件中添加 manifest
 然后,用 Visual Studio 打开可执行文件,并将 manifest 文件作为资料添加于其中

  1. 在 Visual Studio 开发环境中,打开菜单“文件->打开->文件”。

  2. 进入 Visual Studio 解决方案所在的目录。

  3. 进入 Bin 目录,再进入其中的 Debug 目录或者 Release 目录(决定于开发环境中的设置)。

  4. 找到可执行文件(该文本名就该是 <Executeable Name>.exe),双击它以便在 Visual Studio 开发环境中打开。

  5. 在设计器中右键单击应用程序文件,在弹出菜单中选择“添加资源”。

  6. 在“添加资源”对话框中,点击“导入”按钮。

  7. 找到位于的解决方案目录下的 manifest 文件,并将其加入。

  注意:在打开文件对话框中选择文件类型为“所有文件(*.*)”,这样就能看到 manifest 文件。

  8. 双击 manifest 文件。这时候会打开自定义资源类型框(属性窗格中)。

  9. 在自定义资源类型框中输入 RT_MANIFEST,回车确认。

  10. 在属性窗格中,将 ID 设置为 1。

  11. 在文件菜单中选择“保存所有”来保存所做的修改。

 

漂亮的新界面

  运行你的应用程序,这时候,你的窗体界面已经是漂亮的 Windows XP 外观了。点击按钮控件看看进度条控件的新界面。

  如果在非 Windows XP 的其它 Windows 系统中运行这个程序,manifest 会被忽略,因为 Comctl32.dll 6.0 并不存在。这时候,它们会显示出原来的外观,就像一开始用 Visual Studio .NET 制作出来的一样。

 

剩下的步骤

  上面的步骤可靠的解决了让控件显示 Windows XP 外观的问题。如果能够动态的改变某些控件的 FlatStyle 属性为 FlatSytle.System,将给我们带来很大的方便。

  下面的代码实现这样的逻辑,使用一段代码检查窗体中的每一个控件,如果它们是从 ButtonBase 继承而来,就将其 FlatStyle 属性设置为 FlatStyle.System:

' Visual Basic
Private Sub RecursivelyFormatForWinXP(control As Control)
   Dim x As Integer
   For x = 0 To control.Controls.Count - 1
      ' 如果控件从 ButtonBase 继承, 
      ' 将其 FlatStyle 属性设置为 FlatStyle.System.
      If control.Controls(x).GetType().BaseType Is GetType(ButtonBase) Then
         CType(control.Controls(x), ButtonBase).FlatStyle = FlatStyle.System
      End If
      
      ' 如果控件是窗口并包含有其它控件,也要对它所含有的控件进行检查
      If control.Controls.Count > 0 #0000CC
         RecursivelyFormatForWinXP(control.Controls(x))
      End If
   Next x
End Sub
// C#
private void RecursivelyFormatForWinXP(Control control)
{
   for(int x = 0; x < control.Controls.Count; x++)
   {
      // 如果控件从 ButtonBase 继承, 
      // 将其 FlatStyle 属性设置为 FlatStyle.System.
      if(control.Controls[x].GetType().BaseType == typeof(ButtonBase))
      {
         ((ButtonBase)control.Controls[x]).FlatStyle = FlatStyle.System; 
      }
  
      // 如果控件是窗口并包含有其它控件,也要对它所含有的控件进行检查
      if(control.Controls.Count > 0)
      {
         RecursivelyFormatForWinXP(control.Controls[x]);
      }
   }
}

  另外,还需要在窗体的 Load 事件中添加代码检查 manifest 是否有效。

' Visual Basic
Private Sub Form1_Load(sender As Object, e As System.EventArgs)
   ' 确定是在 Windows XP 中运行,
   ' 且相关的 manifest 文件存在.
   If Environment.OSVersion.Version.Major > 4 And _
Environment.OSVersion.Version.Minor > 0 And _
System.IO.File.Exists((Application.ExecutablePath + ".manifest")) Then
      ' 检查所有控件.
      Dim x As Integer
      For x = 0 To (Me.Controls.Count) - 1
         ' 如果控件从 ButtonBase 继承, 
         ' 将其 FlatStyle 属性设置为 FlatStyle.System.
         If Me.Controls(x).GetType().BaseType Is GetType(ButtonBase) Then
            CType(Me.Controls(x), ButtonBase).FlatStyle = FlatStyle.System
         End If
         RecursivelyFormatForWinXP(Me.Controls(x))
      Next x
   End If
End Sub
// C#
private void Form1_Load(object sender, System.EventArgs e)
{
   // 确定是在 Windows XP 中运行,
   // 且相关的 manifest 文件存在.
   if(Environment.OSVersion.Version.Major > 4 
     & Environment.OSVersion.Version.Minor > 0 
     & System.IO.File.Exists(Application.ExecutablePath + ".manifest"))
   { 
      // 检查所有控件.
      for(int x = 0; x < this.Controls.Count; x++)
      {
         // 如果控件从 ButtonBase 继承, 
         // 将其 FlatStyle 属性设置为 FlatStyle.System.
         if(this.Controls[x].GetType().BaseType == typeof(ButtonBase))
         {
            ((ButtonBase)this.Controls[x]).FlatStyle = FlatStyle.System; 
         }
         RecursivelyFormatForWinXP(this.Controls[x]);
      }
   }
}

 

小结

  这篇文章说明了如下一些问题:

  1. 控件在 Windows XP 中的外观和在 Visual Studio 中的标准外观是不同的。

  2. 可以将大部分控件的外观改变成 Windows XP 样式。

  3. 对于大部分控件,需要为它们指定 Comctl32.dll 的一个特殊版本,而其它的,需要改变它们的 FlatStyle 属性。而且,还有小部分控件不能改变外观。

  4. 可以写代码检查操作系统版本,以及检查 manifest 文件是否存在。可以适当地动态设置控件属性。

2004年4月6日 9:19

阅读全文
0 0

相关文章推荐

img
取 消
img