Windows フォーム上のコントロールで Windows XP のビジュアル スタイルを使用する方法

Seth Grossman
Visual Studio Team
Microsoft Corporation

January 2002
日本語版最終更新日 2002 年 5 月 30 日

要約: Windows XP は Windows ユーザー インターフェイス (UI) に新しいルック アンド フィールをもたらしました。Windows XP UI は、Visual Studio .NET に収録されているのと同じコントロールから構成されているのにもかかわらず、超モダンな新しい外観を備えています。Windows XP が導入した新しい機能のうちには、マウスが置かれたときに光る丸いコーナーを持つコントロールと、未来的な ProgressBar コントロールの 2 つがあります。

ほとんどの Visual Studio 開発者は、「これらのクールなコントロールを自分のアプリケーションで使うにはどうすればいいのか?」という疑問を抱くでしょう。これは、アプリケーションにいくつかの参照とリソース ファイルを追加するだけで実現できます。この記事では、Visual Basic と Visual C# の Windows アプリケーションに Windows XP のビジュアル スタイルを組み込む方法を説明し、単純なアプリケーションを作成して実例を示します。

   この記事で説明している機能は、Windows XP オペレーティング システム上で実行されるアプリケーションにのみ適用されます。

目次

はじめに
コントロールの種類
マニフェストが一番
コントロールへのビジュアル スタイルの追加
新しい世界へ
次のステップ
結論

はじめに

MicrosoftR WindowsR XP のコントロールは、新しい外観を備えています。

Aa289524.vbxpconafter(ja-jp,VS.71).gif



図 1

一方、開発者が Microsoft Visual StudioR で利用できるコントロールは、同じコントロールであるにもかかわらず、このような外観は備えていません。

Aa289524.vbxpconbefore(ja-jp,VS.71).gif


図 2

この記事では、Visual Studio コントロールに Windows XP のコントロールのような外観を持たせる方法について説明します。

フォームは、クライアント領域と非クライアント領域という 2 つの異なる部分から構成されていると考えることができます。Windows XP オペレーティング システム上で動作するすべてのアプリケーションは、ウィンドウ フレーム、タイトル バー、および非クライアント スクロール バーを含む非クライアント領域を持っています。オペレーティング システムはデフォルトで非クライアント領域にビジュアル スタイルを適用するので、下に示す変更を加えなくても、Windows XP 上で実行される Windows フォームでは新しいスタイルのタイトル バーとスクロール バーが表示されることになります。この記事では、クライアント領域に変更を加える方法について説明します。

コントロールの種類

非クライアント領域の外観は、現在適用されているビジュアル スタイルによって指定されます。ビジュアル スタイルは、アプリケーションまたはオペレーティング システムのユーザー インターフェイスの、ユーザーによる変更が可能な外観です。前に述べたように、フォームのスクロール バーとタイトル バーは、Windows XP 上で実行するとただちに変化します。一部の Windows フォーム コントロールは、アプリケーションがバージョン 6.0 の Comctl32.dll にバインドされた時点で、ただちに新しい外観を持つようになります。

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 コントロール
 

その他のコントロールは、これ以上の指定を必要とします。具体的には、ButtonBase クラス クラスから派生しているコントロール (ButtonRadioButtonGroupBox、および CheckBox コントロール) は、コントロールの描画方法を指定する FlatStyle というプロパティを持っています。このプロパティは、コントロールの描画方法を以下のように指定する FlatStyle 列挙体を使って設定されます。

列挙体のメンバ説明
Flat コントロールはフラットに表示されます。
Popup コントロールはフラットに表示され、マウス ポインタをコントロールの上に移動すると、コントロールの外観がフラットから 3D に変わります。
Standard コントロールは 3D 表示されます。
System コントロールの外観は、ユーザーのオペレーティング システムによって決定されます。

このように、FlatStyle プロパティが System に設定されていると、コントロールの外観はユーザーのオペレーティング システムによって決定されます。この設定により、このプロパティを持つコントロールは Windows XP のスタイルで描画されるようになります。

FlatStyle プロパティが System に設定されているときにビジュアル スタイルが変わるコントロール

  • Button コントロール
  • RadioButton コントロール
  • CheckBox コントロール
  • GroupBox コントロール

最後に、いくつかの Windows フォーム コントロールは、Windows XP と Visual Studio の両方で同じように表示されます。

ビジュアル スタイルが変わらないコントロール

  • Label コントロール
  • LinkLabel コントロール
  • DomainUpDown コントロール
  • NumericUpDown コントロール
  • CheckedListBox コントロール

マニフェストが一番

アプリケーションにビジュアル スタイルを使用させるには、Comctl32.dll バージョン 6 が存在している場合にそれを使用するように指定するアプリケーション マニフェスト (ビルド プロセスの際に特定のリソースを指定するために使用されるファイル) を追加する必要があります。バージョン 6 にはいくつかの新しいコントロールと、既存のコントロールの新しいオプションが含まれていますが、最大の違いは、ウィンドウ内のコントロールの外観の変更がサポートされている点にあります。

これまでのバージョンの Comctl32.dll とは異なり、バージョン 6 は再配布可能ではありません。このダイナミック リンク ライブラリ (DLL) のバージョン 6 を使用するためには、それを含んでいるオペレーティング システムを使用するしかありません。Windows XP にはバージョン 5 とバージョン 6 の両方が含まれています。デフォルトでは、アプリケーションは Comctl32.dll バージョン 5 に定義されているコモン コントロールを使用します (ユーザー コントロールは User32.dll に定義されています)。Comctl32.dll バージョン 6 はユーザー コントロールとコモン コントロールの両方を含んでいます。これらのコントロールに関連付けられている.dll を変更することで、コントロールに Windows XP のビジュアル スタイルを適用することができます。

ユーザーのコンピュータ上のオペレーティング システムとビジュアルな互換性を持たせるために、下で作成する Windows アプリケーションは、Windows フォーム コントロールに Comctl32.dll バージョン 6.0 を使用するように明示的に指定するマニフェスト ファイルを使用しています。マニフェスト ファイルは、アプリケーションにリソースとして含められるか、実行可能ファイルのディレクトリに別個のファイルとして置かれる XML ファイルです。

したがって、Windows フォーム アプリケーションで Windows XP のビジュアル スタイルを使用するためには、以下の作業を行う必要があります。

  • FlatStyle プロパティを持つ個々のコントロールを FlatStyle.System に設定する。
  • アプリケーションを Comctl32.dll バージョン 6.0 にバインドするマニフェスト ファイルを作成する。下のサンプルのマニフェスト ファイルを使用すると、Visual Studio .NET で作成された任意のアプリケーションを Comctl32.dll にバインドすることができます。
  • 実行可能ファイルにこのリソース (マニフェスト) を追加し、リビルドする。

コントロールへのビジュアル スタイルの追加

Windows XP のビジュアル スタイルの適用方法は、実例を通して学ぶのが一番です。この記事の残りの部分では、単純なアプリケーションを作成し、そのアプリケーションのフォーム上のコントロールに、現在オペレーティング システムに適用されている Windows XP のビジュアル スタイルを適用する方法を説明します。

以下の手順では、次の操作を行います。

  • Windows アプリケーション プロジェクトを作成し、これにコントロールを追加する。
  • Windows XP のビジュアル スタイルを提供する DLL にアプリケーションをバインドするマニフェスト ファイルを作成する。
  • マニフェスト ファイルを実行可能ファイルのディレクトリに移動する。
  • 実行可能ファイルにリソース (マニフェスト) を追加する。

では始めましょう。まず最初に、Windows アプリケーション プロジェクトを作成します。

プロジェクトの作成

プロジェクトを作成し、フォーム上にコントロールを配置するには

  1. Windows アプリケーション プロジェクトを作成します。Windows アプリケーションの詳しい作成方法については、「Windows アプリケーション プロジェクトの作成」を参照してください。
       プロジェクトの名前と保存先のディレクトリを書き留めてください。これらは後で重要になります。
  2. ツールボックスから以下のコンポーネントをフォームにドラッグし、配置します。
    • Button コントロール
    • RadioButton コントロール
    • ProgressBar コントロール
    • CheckBox コントロール
    • Label コントロール
         Label コントロールは、ビジュアル スタイルが適用されるコントロールとは異なり、外観が変化しません。上で示した表には、Comctl32.dll を通して変更されるコントロール、FlatStyle プロパティが設定されているときに変化するコントロール、そして外観が変化しないコントロールのリストがあります。
  3. ButtonRadioButton、および CheckBox コントロールの FlatStyle プロパティを System に設定します。
    ヒント   3 つのコントロールを一度に設定するには、CTRL キーを押しながら各コントロールをクリックして、すべてのコントロールを選択します。その後、[プロパティ] ウィンドウで、FlatStyle プロパティの横のドロップダウン ボックスから System を選択します。
  4. Button コントロールをダブルクリックして、Click イベント ハンドラを追加します。

    コード エディタが開き、イベント ハンドラに挿入ポイントが置かれます。

  5. ProgressBar コントロールの Value プロパティに次のコードを追加し、実行時に新しいプログレス バーが表示されるようにします。
    ' 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;
    }
  6. [ビルド] メニューの [ビルド] を選択して、ソリューションをビルドします。
  7. [ファイル] メニューの [すべてを保存] を選択して、作業の結果を保存します。

マニフェスト ファイルの作成

次に、アプリケーションを正しいバージョンの Comctl32.dll にバインドする XML ファイルを作成します。

マニフェスト ファイルを作成して編集するには

  1. ソリューション エクスプローラで、プロジェクトを右クリックします。[追加] をポイントし、[新しい項目の追加] をクリックします。
  2. [新しい項目の追加] ダイアログ ボックスで、次の操作を行います。
    1. 左のペイン ([カテゴリ]) で、[ローカル プロジェクト アイテム] をクリックします。
    2. 右のペイン ([テンプレート]) で、[テキスト ファイル] をクリックします。
    3. [ファイル名] ボックスで、 <実行可能ファイル名>.exe.manifest の形式でファイルを指定します。アプリケーションが MyXPApp という名前ならば、XML ファイルは MyXPApp.exe.manifest という名前になります。
  3. [開く] ボタンをクリックして XML ファイルを作成し、ダイアログ ボックスを閉じます。

    追加した空のテキスト ファイルがテキスト エディタで開かれます。

  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>
    ヒント   < と > の記号が、貼り付けの際に
    <
    >
    に置き換えられた場合には、貼り付けられたテキストを削除し、デザイン サーフェスを右クリックし、ショートカット メニューから [HTML として貼り付け] を選択します。
  5. 上で貼り付けた XML の中で、 <Executable Name> を、ステップ 2 で指定した実行可能ファイルの実際の名前に置き換えます。
  6. [ビルド] メニューの [ビルド] を選択して、ソリューションをビルドします。
  7. [ファイル] メニューの [すべてを保存] を選択して、XML ファイルを保存します。

実行可能ファイルのディレクトリへのマニフェストの移動

次に、上で作成したマニフェストを、既定の位置から、実行可能ファイルを含んでいるディレクトリにコピーします。

マニフェスト ファイルを移動するには

  1. Windows エクスプローラで、Visual Studio ソリューションが保存されているディレクトリに移動します。これは「プロジェクトの作成」のセクションのステップ 1 で保存先として指定したディレクトリです。

    このディレクトリには、上のセクションで作成したマニフェスト ファイルが存在するはずです ( <実行可能ファイル名>.exe.manifest という名前のファイル)。

  2. マニフェストをクリックして選択し、[編集] メニューの [コピー] を選択します。
  3. 次に、obj ディレクトリを開き、さらに (開発環境で設定したビルド オプションに応じて) debug または retail ディレクトリを開きます。これが、実行可能ファイルが格納されているディレクトリです (実行可能ファイルの名前は ProjectName.exe という形式になっています)。
  4. [編集] メニューの [貼り付け] を選択して、マニフェスト ファイルをこのディレクトリに追加します。

実行可能ファイルへのマニフェストの追加

次に、Visual Studio で実行可能ファイルを開き、マニフェストをリソースとして追加します。

マニフェストをリソースとして追加するには

  1. Visual Studio 開発環境で、[ファイル] メニューの [開く] をポイントし、[ファイル] をクリックします。
  2. この Visual Studio ソリューションを含んでいるディレクトリに移動します。これは、「プロジェクトの作成」のセクションのステップ 1 で保存先として指定したディレクトリです。
  3. obj ディレクトリを開き、さらに (開発環境で設定したビルド オプションに応じて) debug または retail ディレクトリを開きます。
  4. 実行可能ファイルを探し ( ProjectName.exe の形式になっています)、ダブルクリックして、Visual Studio 環境内で開きます。
  5. デザイナ内で実行可能ファイルを右クリックし、[リソースの追加] を選択します。
  6. [リソースの追加] ダイアログ ボックスで、[インポート] ボタンをクリックします。
  7. 上で作成したマニフェストに移動します。これはソリューションと同じディレクトリにあるはずです。
       マニフェスト ファイルが表示されるように、ダイアログ ボックスの [ファイルの種類] フィールドは [すべてのファイル (*.*) ] に設定します。
  8. マニフェスト ファイルをダブルクリックします。

    [カスタム リソースの種類] ダイアログ ボックスが開きます。

  9. [リソースの種類] ボックスに RT_MANIFEST と入力し、[OK] をクリックします。
  10. [プロパティ] ウィンドウで、ID プロパティを 1 に設定します。
  11. [ファイル] メニューの [すべてを保存] を選択して、変更を保存します。

新しい世界へ

アプリケーションを実行すると、Windows フォーム上のコントロールは、Windows XP の未来的なビジュアル スタイルで表示されます。Button コントロールをクリックして、ProgressBar コントロールの新しい外観を確認してください。

このアプリケーションを Windows XP 以外のバージョンの Windows を実行しているコンピュータに導入した場合には、バージョン 6.0 の Comctl32.dll が存在していないため、マニフェストは無視されます。このとき、コントロールは Visual Studio .NET で作成しているときと同じ通常の外観で表示されます。

次のステップ

上に示した問題の、より堅牢で信頼性の高いソリューションとしては、オペレーティング システムのバージョンと、実行可能ファイルと同じディレクトリに置かれたアプリケーション マニフェスト ファイルの存在の両方をチェックし、FlatStyle プロパティを動的に System に変更するというアプローチが考えられます。この方法では、XCopy コマンドによる導入も可能となります。

次のコードは、フォーム上のコントロールを巡回して、それらが ButtonBase クラスから派生しているかどうかをチェックし、そうであれば FlatStyle プロパティを適宜設定するプロシージャを使って、このロジックをインプリメントしています。

' 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 Then
         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 イベント ハンドラを変更して、Windows XP が実行されており、マニフェスト ファイルが存在しているかどうかをチェックする必要があります。

' Visual Basic
Private Sub Form1_Load(sender As Object, e As System.EventArgs)
   ' Windows XP が実行されており、
   ' EXE の.manifest ファイルが存在することを確認する。
   If Environment.OSVersion.Version.Major > 4 And _
Environment.OSVersion.Version.Minor > 0 And _
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 = _
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 が実行されており、
   // EXE の.manifest ファイルが存在することを確認する。
   if(Environment.OSVersion.Version.Major > 4 
     & Environment.OSVersion.Version.Minor > 0 
     & 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 の標準の Windows フォーム コントロールとは異なる外観を持ちます。
  2. 新しい Windows フォーム コントロールの外観は、Windows XP の外観に変更することができます。
  3. ほとんどのコントロールでは、このプロセスは特定のバージョンの Comctl32.dll にバインドすることで実現されます。その他のコントロールでは、プログラマが FlatStyle プロパティを設定する必要があります。最後に、外観がまったく変化しないコントロールもあります。
  4. オペレーティング システムのバージョンと.manifest ファイルの存在をチェックし、該当するプロパティを動的に設定するコードを書くことができます。

Page view tracker