DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

コントロールの外観をXPスタイルにする

下図のようにコントロールの見た目をWindows XP独特のスタイル(Windows XP スタイル、Windows XP ビジュアルスタイル、Luna、Whistlerスタイル)に変える方法です。当たり前のことですが、XPスタイルに対応していないOSや、設定でXPスタイルを無効にしている場合は、以下の方法を行ってもXPスタイルになりません。

XPスタイルのコントロール

Visual Studio 2005以降では、デフォルトでXPスタイルで表示されるようになっています。ここで紹介する方法は、これを無効にする(あるいは無効になってしまったものを元に戻す)目的で参考になるでしょう。

Visual Studio 2005以降のVB.NETで、Visual Basicアプリケーションモデルを使用する方法

Visual Studio 2005以降のVB.NETを使用している場合は、次のような方法でできます。

1.メニューの「プロジェクト」-「プロパティ」により、プロジェクトのプロパティを表示します。

2.「アプリケーション」タブ(デフォルトで表示される)を選択します。

3.「アプリケーションフレームワークを有効にする」にチェックを入れて、有効にします。

4.「Windowsアプリケーションフレームワークプロパティ」の「XP Visual スタイルを有効にする」にチェックを入れ、有効にします。

5.以上です。

EnableVisualStylesを使用する方法

.NET Farmework 1.1以降では、Application.EnableVisualStylesメソッドを使用できます。以下にその手順を示します。

1..NET Framework 1.1の場合、FlatStyleプロパティがあるコントロールは、これをSystemに変更します。System.Windows.Forms.ButtonBaseクラスから派生したコントロールがこれにあたります。.NET Framework 2.0以降では、この必要がありません。

2.エントリポイントのMain関数の一行目に

Application.EnableVisualStyles()

を記述します。

なお、エントリポイントについては、こちらで説明しています。

VB.NET
コードを隠すコードを選択
<STAThread()> _
Public Shared Sub Main()
    Application.EnableVisualStyles()
    'TooBarの画像が表示されない場合は次の行を加える
    'Application.DoEvents()
    Application.Run(New Form1)
End Sub
C#
コードを隠すコードを選択
[STAThread]
static void Main() 
{
    Application.EnableVisualStyles();
    //TooBarの画像が表示されない場合は次の行を加える
    //Application.DoEvents();
    Application.Run(new Form1());
}

3.以上です。

補足:ただしこの方法は、.NET Farmework 1.1では、多くの問題があるようなので、あまりお勧めできません。下に紹介するマニフェストファイルを使う方法をお勧めします。.NET Farmework 2.0以降では問題なく、上記の「Application.DoEvents」も必要ありません。

マニフェストファイルを使用する方法

.NET Farmework 1.0の場合は、マニフェストファイルを作成する必要があります。以下にその手順を示します。

1.上と同じく、FlatStyleプロパティがあるコントロールは、これをSystemに変更します。

2.下記の内容のテキストファイル(文字コードはUTF-8)を作り、ファイル名を「(実行ファイルのファイル名).manifest」として実行ファイルと同じフォルダに保存します。例えば、実行ファイル名が「MyApp.exe」であれば、「MyApp.exe.manifest」という名前にします。

この時、assemblyIdentity要素のname属性の「Organization.Division.Name」の部分は、ユニークなアプリケーション名(例えば、「MyCompany.MyProduct.MyApplication」のように)に変更してください。またversion属性や、processorArchitecture属性(64-bit Windows であれば、"ia64")、description要素の値も必要に応じて変更してください。マニフェストの書き方について詳しくは、「Application Manifests」をご覧ください。

<?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="Organization.Division.Name"
    type="win32"
  />
  <description>アプリケーションの説明</description>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        processorArchitecture="X86"
        publicKeyToken="6595b64144ccf1df"
        language="*"
      />
    </dependentAssembly>
  </dependency>
</assembly>

3.EXEファイルを実行させると、きっとXPスタイルになっているでしょう。

マニフェストファイルを実行ファイルに埋め込む

マニフェストファイルを実行ファイルに埋め込む方法は、MSDNの「Using Windows XP Visual Styles With Controls on Windows Forms」や、The Code Projectの「Windows XP Visual Styles for Windows Forms」で紹介されています。つまりは、Win32リソースとしてマニフェストファイルを実行ファイルに埋め込めばよいということです。

実行ファイルにWin32リソースを埋め込む方法は、「Win32リソースを実行ファイルに埋め込む」で詳しく説明していますので、そちらをご覧ください。

補足:Visual StudioやPlatform SDKに付属しているマニフェストツール「mt.exe」を使って、マニフェストファイルを埋め込むこともできます。例えば、プロジェクトフォルダにマニフェストファイルを置いて、Visual Studioでプロジェクトのプロパティの「ビルド後のイベントコマンドライン」(C#では「ビルドイベント」タブ、Visual Studio 2005以上のVB.NETでは「コンパイル」タブの「ビルドイベント」、Visual Studio 2003以下のVB.NETでは不可)を

mt.exe -manifest "$(ProjectDir)$(TargetFileName).manifest" -outputresource:"$(TargetPath)";1

とすると、ビルド後に自動的にマニフェストファイルを埋め込むことができます。

補足:アプリケーションをXPスタイルにするためのマニフェストを自動的に作成してくれるフリーのツールが幾つか存在し、Vectorから「XP スタイル」で検索すると見つかります。さらにその中にはマニフェストを実行ファイルに埋め込んでくれるものもあります。例えば「ExeStyleXP」はEXEファイルに埋め込むことができ、コマンドラインからも起動できるようで、とても便利です。これを使えば、プロジェクトのプロパティの「ビルド後のイベントコマンドライン」(C#では「ビルドイベント」タブ、Visual Studio 2005以上のVB.NETでは「コンパイル」タブの「ビルドイベント」、Visual Studio 2003以下のVB.NETでは不可)を

ExeStyleXP.exe "$(TargetPath)"

とすると、ビルド後に自動的にマニフェストファイルを埋め込むことができます。
補足:Visual Studio 2008以降では、プロジェクトのプロパティの設定によってマニフェストを自動で埋め込むことができます。詳しくは、「UACが有効の時、アプリケーションを管理者に昇格させて起動する」をご覧ください。