在 .NET 程序的窗體中使用 XP 風格的控件

在 .NET 程序的窗體中使用 XP 風格的控件

編譯:邊城狂人

 

原著:微軟 Visual Studio 團隊的 Seth Grossman,2002 年 2 月
編譯:邊城狂人,2002 年 9 月

 

摘要

  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 控件的值,以便在運行時可以看到進度條的新外觀。

 Button1_Click( sender  System.Object, _
     e  System.EventArgs)  Button1.Click
    ProgressBar1.Value = 50
 button1_Click( 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 代碼:

 ="1.0" ="UTF-8" ="yes"
 ="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"

   ="1.0.0.0"
   ="X86"
   ="Microsoft.Winweb."
   ="win32"

.NET control deployment tool
   
     
       ="win32"
       ="Microsoft.Windows.Common-Controls"
       ="6.0.0.0"
       ="X86"
       ="6595b64144ccf1df"
       ="*"
     
   
提示:粘貼的時候如果 < 和 > 被換成了 &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:

 RecursivelyFormatForWinXP(control  Control)
    x  Integer
    x = 0  control.Controls.Count - 1

       control.Controls(x).GetType().BaseType Is GetType(ButtonBase) 
         CType(control.Controls(x), ButtonBase).FlatStyle = FlatStyle.System
      
      

       control.Controls.Count > 0 
         RecursivelyFormatForWinXP(control.Controls(x))
      
    x

 RecursivelyFormatForWinXP(Control control)
{
   ( x = 0; x < control.Controls.Count; x++)
   {

      (control.Controls[x].GetType().BaseType == typeof(ButtonBase))
      {
         ((ButtonBase)control.Controls[x]).FlatStyle = FlatStyle.System; 
      }
  
(control.Controls.Count > 0)
      {
         RecursivelyFormatForWinXP(control.Controls[x]);
      }
   }
}

  另外,還需要在窗體的 Load 事件中添加代碼檢查 manifest 是否有效。

 Form1_Load(sender  Object, e  System.EventArgs)

    Environment.OSVersion.Version.Major > 4  _
Environment.OSVersion.Version.Minor > 0  _
System.IO.File.Exists((Application.ExecutablePath + ".manifest")) 

       x  Integer
       x = 0  (Me.Controls.Count) - 1

          Me.Controls(x).GetType().BaseType Is GetType(ButtonBase) 
            CType(Me.Controls(x), ButtonBase).FlatStyle = FlatStyle.System
         
         RecursivelyFormatForWinXP(Me.Controls(x))
       x
   

 Form1_Load( sender, System.EventArgs e)
{

   (Environment.OSVersion.Version.Major > 4 
     & Environment.OSVersion.Version.Minor > 0 
     & System.IO.File.Exists(Application.ExecutablePath + ".manifest"))
   { 

      (int x = 0; x < this.Controls.Count; x++)
      {

         (.Controls[x].GetType().BaseType == typeof(ButtonBase))
         {
            ((ButtonBase).Controls[x]).FlatStyle = FlatStyle.System; 
         }
         RecursivelyFormatForWinXP(this.Controls[x]);
      }
   }
}

 

小結

  這篇文章說明了如下一些問題:

  1. 控件在 Windows XP 中的外觀和在 Visual Studio 中的標準外觀是不同的。

  2. 可以將大部分控件的外觀改變成 Windows XP 樣式。

  3. 對於大部分控件,需要爲它們指定 Comctl32.dll 的一個特殊版本,而其它的,需要改變它們的 FlatStyle 屬性。而且,還有小部分控件不能改變外觀。

  4. 可以寫代碼檢查操作系統版本,以及檢查 manifest 文件是否存在。可以適當地動態設置控件屬性。

 

(2002年08月28日發表於計算機世界知識中心)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章