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

Visualスタイルでコントロールを描画する

注意:ここで紹介している方法は、.NET Framework 2.0以降でのみ使用できます。
注意:画像の表示方法が分からないという方は、まず「コントロールやフォームに画像を表示する」をご覧ください。

コントロールを描画する方法は「コントロールを描画する」で説明しましたが、ここではコントロールをvisualスタイルで描画する方法を紹介します。

(コントロール名)Rendererクラスを使用する方法

「(コントロール名)Renderer」という名前のクラスを使うことで、コントロールをvisualスタイルで描画できます。このようなクラスを表にすると、以下のようになります。

コントロール 描画に使用するクラス 補足
Button ButtonRendererクラス RenderMatchingApplicationStateプロパティをTrueにすることにより、アプリケーションのvisualスタイルが無効な場合でもvisualスタイルで描画される
CheckBox CheckBoxRendererクラス RenderMatchingApplicationStateプロパティをTrueにすることにより、アプリケーションのvisualスタイルが無効な場合でもvisualスタイルで描画される
GroupBox GroupBoxRendererクラス RenderMatchingApplicationStateプロパティをTrueにすることにより、アプリケーションのvisualスタイルが無効な場合でもvisualスタイルで描画される
RadioButton RadioButtonRendererクラス RenderMatchingApplicationStateプロパティをTrueにすることにより、アプリケーションのvisualスタイルが無効な場合でもvisualスタイルで描画される
ComboBox ComboBoxRendererクラス visualスタイルが無効な場合に例外をスロー
ProgressBar ProgressBarRendererクラス visualスタイルが無効な場合に例外をスロー
ScrollBar ScrollBarRendererクラス visualスタイルが無効な場合に例外をスロー
Tab TabRendererクラス visualスタイルが無効な場合に例外をスロー
TextBox TextBoxRendererクラス visualスタイルが無効な場合に例外をスロー
TrackBar TrackBarRendererクラス visualスタイルが無効な場合に例外をスロー

上の表で「visualスタイルが無効な場合に例外をスロー」と書かれているクラスは、visualスタイルが無効な場合(OSがサポートしていないか、ユーザーが無効にしているか、アプリケーションウィンドウのクライアント領域に適用されていない場合)に使用すると、例外InvalidOperationExceptionをスローします。「RenderMatchingApplicationStateプロパティをTrueにすることにより...」と書かれているクラスは、visualスタイルが無効な場合(前記条件に加え、現在のアプリケーションにvisualスタイルが適用されていない場合)に使用すると、クラシックスタイルで描画されます。さらにこれらのクラスのRenderMatchingApplicationStateプロパティをTrueにすると、visualスタイルが無効な場合でもvisualスタイルで描画されます。

visualスタイルが無効な場合に例外をスローするクラスでは、そのクラスのIsSupportedプロパティを使ってそのクラスが使用できるか確認できます。

補足:OSがvisualスタイルをサポートしているかを調べるには、VisualStyleInformation.IsSupportedByOSプロパティがTrueを返すか調べます。ユーザーがvisualスタイルを有効にしているかを調べるには、VisualStyleInformation.IsEnabledByUserプロパティがTrueを返すか調べます。アプリケーションウィンドウのクライアント領域にvisualスタイルが使用されているか調べるには、Application.VisualStyleStateプロパティにVisualStyleState.ClientAreaEnabledかVisualStyleState.ClientAndNonClientAreasEnabledが設定されているかを調べます。
これら3つがすべて有効かを調べるには、VisualStyleRenderer.IsSupportedプロパティがTrueを返すか調べます。
これら3つがすべて有効で、さらに現在のアプリケーションにvisualスタイルが適用されているか調べるには、Application.RenderWithVisualStylesプロパティがTrueを返すか調べます。

以下にこれらのクラスを使ってコントロールを描画する例を示します。ここでは、ピクチャボックスである"PictureBox1"に描画しています。

VB.NET
コードを隠すコードを選択
'Imports System.Drawing
'Imports System.Windows.Forms

'描画先とするImageオブジェクトを作成する
Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
'ImageオブジェクトのGraphicsオブジェクトを作成する
Dim g As Graphics = Graphics.FromImage(canvas)

'ボタンコントロールを描画する
Dim butonRect As New Rectangle(10, 10, 100, 22)
'背景を描画
ButtonRenderer.DrawParentBackground(g, butonRect, PictureBox1)
'フォーカスを描画し、普通の状態とする
ButtonRenderer.DrawButton(g, butonRect, PictureBox1.Text, PictureBox1.Font, _
    True, System.Windows.Forms.VisualStyles.PushButtonState.Normal)

'チェックボックスを描画する
'大きさと位置を計算
Dim checkBoxRect As New Rectangle(10, 40, 100, 24)
Dim checkBoxLocation As New Point(checkBoxRect.X, _
    checkBoxRect.Y + (checkBoxRect.Height - 13) / 2)
Dim checkBoxTextRect As New Rectangle(checkBoxRect.X + 16, checkBoxRect.Y, _
    checkBoxRect.Width - 16, checkBoxRect.Height)
'テキストの表示法
Dim checkBoxTextFormat As TextFormatFlags = _
    TextFormatFlags.Left Or TextFormatFlags.VerticalCenter
'チェックされた普通の状態とする
CheckBoxRenderer.DrawCheckBox(g, checkBoxLocation, checkBoxTextRect, _
    "チェックボックス", PictureBox1.Font, checkBoxTextFormat, False, _
    System.Windows.Forms.VisualStyles.CheckBoxState.CheckedNormal)

'グループボックスを描画する
GroupBoxRenderer.DrawGroupBox(g, New Rectangle(10, 65, 100, 65), _
    System.Windows.Forms.VisualStyles.GroupBoxState.Normal)

'ラジオボタンを描画する
'大きさと位置を計算
Dim radioButtonRect As New Rectangle(10, 130, 100, 24)
Dim radioButtonLocation As New Point(radioButtonRect.X, _
    radioButtonRect.Y + (radioButtonRect.Height - 13) / 2)
Dim radioButtonTextRect As New Rectangle(radioButtonRect.X + 16, _
    radioButtonRect.Y, radioButtonRect.Width - 16, radioButtonRect.Height)
'テキストの表示法
Dim radioButtonTextFormat As TextFormatFlags = _
    TextFormatFlags.Left Or TextFormatFlags.VerticalCenter
'チェックされた普通の状態とする
RadioButtonRenderer.DrawRadioButton(g, radioButtonLocation, _
    radioButtonTextRect, "ラジオボタン", PictureBox1.Font, _
    radioButtonTextFormat, False, _
    System.Windows.Forms.VisualStyles.RadioButtonState.CheckedNormal)

'コンボボックスを描画する
If ComboBoxRenderer.IsSupported Then
    '大きさと位置を計算
    Dim comboBoxRect As New Rectangle(10, 160, 100, 20)
    Dim comboBoxButtonRect As New Rectangle( _
        comboBoxRect.X + comboBoxRect.Width - 18, comboBoxRect.Y + 1, _
        17, comboBoxRect.Height - 2)
    'テキストの表示法
    Dim comboBoxTextFormat As TextFormatFlags = TextFormatFlags.TextBoxControl
    'テキストボックスの描画
    ComboBoxRenderer.DrawTextBox(g, comboBoxRect, "コンボボックス", _
        PictureBox1.Font, comboBoxTextFormat, _
        System.Windows.Forms.VisualStyles.ComboBoxState.Normal)
    'ドロップダウンボタンの描画
    ComboBoxRenderer.DrawDropDownButton(g, comboBoxButtonRect, _
        System.Windows.Forms.VisualStyles.ComboBoxState.Normal)
End If

'プログレスバーバーを描画する
If ProgressBarRenderer.IsSupported Then
    '大きさと位置を計算
    Dim progressBarRect As New Rectangle(120, 10, 100, 23)
    Dim progressBarChunksRect As New Rectangle(progressBarRect.X + 3, _
        progressBarRect.Y + 3, 50, progressBarRect.Height - 6)
    '空のプログレスバーバーを描画
    ProgressBarRenderer.DrawHorizontalBar(g, progressBarRect)
    'プログレスバーバーの中身を描画
    ProgressBarRenderer.DrawHorizontalChunks(g, progressBarChunksRect)
End If

'スクロールバーを描画する
If ScrollBarRenderer.IsSupported Then
    Dim scrollBarRect As New Rectangle(120, 40, 100, 17)
    'トラックの描画
    ScrollBarRenderer.DrawLeftHorizontalTrack(g, _
        New Rectangle(scrollBarRect.X, scrollBarRect.Y, 50, _
            scrollBarRect.Height), _
        System.Windows.Forms.VisualStyles.ScrollBarState.Normal)
    ScrollBarRenderer.DrawRightHorizontalTrack(g, _
        New Rectangle(scrollBarRect.X + 50, scrollBarRect.Y, _
            50, scrollBarRect.Height), _
        System.Windows.Forms.VisualStyles.ScrollBarState.Pressed)
    'つまみの描画
    ScrollBarRenderer.DrawHorizontalThumb(g, _
        New Rectangle(scrollBarRect.X + 40, scrollBarRect.Y, _
            20, scrollBarRect.Height), _
        System.Windows.Forms.VisualStyles.ScrollBarState.Normal)
    'つまみのグリップを描画
    ScrollBarRenderer.DrawHorizontalThumbGrip(g, _
        New Rectangle(scrollBarRect.X + 40, scrollBarRect.Y, _
            20, scrollBarRect.Height), _
        System.Windows.Forms.VisualStyles.ScrollBarState.Normal)
    '矢印ボタンの描画
    ScrollBarRenderer.DrawArrowButton(g, _
        New Rectangle(scrollBarRect.X, scrollBarRect.Y, _
            17, scrollBarRect.Height), _
        System.Windows.Forms.VisualStyles.ScrollBarArrowButtonState.LeftNormal)
    ScrollBarRenderer.DrawArrowButton(g, _
        New Rectangle(scrollBarRect.X + scrollBarRect.Width - 17, _
            scrollBarRect.Y, 17, scrollBarRect.Height), _
        System.Windows.Forms.VisualStyles.ScrollBarArrowButtonState.RightHot)
End If

'タブを描画する
If TabRenderer.IsSupported Then
    '大きさと位置を計算
    Dim tabRect As New Rectangle(120, 65, 100, 50)
    Dim tabItemRect As New Rectangle(tabRect.X, tabRect.Y, 50, 16)
    Dim tabPageRect As New Rectangle( _
        tabRect.X, tabRect.Y + tabItemRect.Height, tabRect.Width, _
        tabRect.Height - tabItemRect.Height)
    'タブページの描画
    TabRenderer.DrawTabPage(g, tabPageRect)
    'タブアイテムの描画
    TabRenderer.DrawTabItem(g, tabItemRect, "タブ1", PictureBox1.Font, False, _
        System.Windows.Forms.VisualStyles.TabItemState.Selected)
End If

'テキストボックスを描画する
If TextBoxRenderer.IsSupported Then
    Dim textBoxRect As New Rectangle(120, 125, 100, 19)
    Dim textBoxFormat As TextFormatFlags = TextFormatFlags.TextBoxControl
    TextBoxRenderer.DrawTextBox(g, textBoxRect, "テキストボックス", _
        PictureBox1.Font, textBoxFormat, _
        System.Windows.Forms.VisualStyles.TextBoxState.Normal)
End If

'トラックバーを描画する
If TrackBarRenderer.IsSupported Then
    '大きさと位置を計算
    Dim trackBarRect As New Rectangle(120, 150, 100, 5)
    Dim trackBarTrackRect As New Rectangle( _
        trackBarRect.X + 8, trackBarRect.Y + 10, trackBarRect.Width - 16, 4)
    Dim trackBarTicksRect As New Rectangle( _
        trackBarRect.X + 13, trackBarRect.Y + 25, trackBarRect.Width - 26, 4)
    Dim trackBarThumbRect As New Rectangle( _
        trackBarRect.X + 8, trackBarRect.Y + 2, 11, 21)
    'トラックの描画
    TrackBarRenderer.DrawHorizontalTrack(g, trackBarTrackRect)
    '目盛りの描画
    TrackBarRenderer.DrawHorizontalTicks(g, trackBarTicksRect, 11, _
        System.Windows.Forms.VisualStyles.EdgeStyle.Raised)
    'つまみの描画
    TrackBarRenderer.DrawBottomPointingThumb(g, trackBarThumbRect, _
        System.Windows.Forms.VisualStyles.TrackBarThumbState.Normal)
End If

g.Dispose()

'PictureBox1に表示する
PictureBox1.Image = canvas
C#
コードを隠すコードを選択
//using System.Drawing;
//using System.Windows.Forms;

//描画先とするImageオブジェクトを作成する
Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height);
//ImageオブジェクトのGraphicsオブジェクトを作成する
Graphics g = Graphics.FromImage(canvas);

//ボタンコントロールを描画する
Rectangle butonRect = new Rectangle(10, 10, 100, 22);
//背景を描画
ButtonRenderer.DrawParentBackground(g, butonRect, PictureBox1);
//フォーカスを描画し、普通の状態とする
ButtonRenderer.DrawButton(g, butonRect,
    PictureBox1.Text, PictureBox1.Font, true,
    System.Windows.Forms.VisualStyles.PushButtonState.Normal);

//チェックボックスを描画する
//大きさと位置を計算
Rectangle checkBoxRect = new Rectangle(10, 40, 100, 24);
Point checkBoxLocation = new Point(checkBoxRect.X,
    checkBoxRect.Y + (checkBoxRect.Height - 13) / 2);
Rectangle checkBoxTextRect = new Rectangle(
    checkBoxRect.X + 16, checkBoxRect.Y,
    checkBoxRect.Width - 16, checkBoxRect.Height);
//テキストの表示法
TextFormatFlags checkBoxTextFormat = TextFormatFlags.Left |
    TextFormatFlags.VerticalCenter;
//チェックされた普通の状態とする
CheckBoxRenderer.DrawCheckBox(g,
    checkBoxLocation, checkBoxTextRect,
    "チェックボックス", PictureBox1.Font, checkBoxTextFormat, false,
    System.Windows.Forms.VisualStyles.CheckBoxState.CheckedNormal);

//グループボックスを描画する
GroupBoxRenderer.DrawGroupBox(g,
    new Rectangle(10, 65, 100, 65),
    System.Windows.Forms.VisualStyles.GroupBoxState.Normal);

//ラジオボタンを描画する
//大きさと位置を計算
Rectangle radioButtonRect = new Rectangle(10, 130, 100, 24);
Point radioButtonLocation = new Point(radioButtonRect.X,
    radioButtonRect.Y + (radioButtonRect.Height - 13) / 2);
Rectangle radioButtonTextRect = new Rectangle(
    radioButtonRect.X + 16, radioButtonRect.Y,
    radioButtonRect.Width - 16, radioButtonRect.Height);
//テキストの表示法
TextFormatFlags radioButtonTextFormat = TextFormatFlags.Left |
    TextFormatFlags.VerticalCenter;
//チェックされた普通の状態とする
RadioButtonRenderer.DrawRadioButton(g,
    radioButtonLocation, radioButtonTextRect,
    "ラジオボタン", PictureBox1.Font, radioButtonTextFormat, false,
    System.Windows.Forms.VisualStyles.RadioButtonState.CheckedNormal);

//コンボボックスを描画する
if (ComboBoxRenderer.IsSupported)
{
    //大きさと位置を計算
    Rectangle comboBoxRect = new Rectangle(10, 160, 100, 20);
    Rectangle comboBoxButtonRect = new Rectangle(
        comboBoxRect.X + comboBoxRect.Width - 18, comboBoxRect.Y + 1,
        17, comboBoxRect.Height - 2);
    //テキストの表示法
    TextFormatFlags comboBoxTextFormat = TextFormatFlags.TextBoxControl;
    //テキストボックスの描画
    ComboBoxRenderer.DrawTextBox(g, comboBoxRect,
        "コンボボックス", PictureBox1.Font, comboBoxTextFormat,
        System.Windows.Forms.VisualStyles.ComboBoxState.Normal);
    //ドロップダウンボタンの描画
    ComboBoxRenderer.DrawDropDownButton(g, comboBoxButtonRect,
        System.Windows.Forms.VisualStyles.ComboBoxState.Normal);
}

//プログレスバーバーを描画する
if (ProgressBarRenderer.IsSupported)
{
    //大きさと位置を計算
    Rectangle progressBarRect = new Rectangle(120, 10, 100, 23);
    Rectangle progressBarChunksRect = new Rectangle(
        progressBarRect.X + 3, progressBarRect.Y + 3,
        50, progressBarRect.Height - 6);
    //空のプログレスバーバーを描画
    ProgressBarRenderer.DrawHorizontalBar(g,
        progressBarRect);
    //プログレスバーバーの中身を描画
    ProgressBarRenderer.DrawHorizontalChunks(g,
        progressBarChunksRect);
}

//スクロールバーを描画する
if (ScrollBarRenderer.IsSupported)
{
    Rectangle scrollBarRect = new Rectangle(120, 40, 100, 17);
    //トラックの描画
    ScrollBarRenderer.DrawLeftHorizontalTrack(g,
        new Rectangle(scrollBarRect.X, scrollBarRect.Y,
            50, scrollBarRect.Height),
        System.Windows.Forms.VisualStyles.ScrollBarState.Normal);
    ScrollBarRenderer.DrawRightHorizontalTrack(g,
        new Rectangle(scrollBarRect.X + 50, scrollBarRect.Y,
            50, scrollBarRect.Height),
        System.Windows.Forms.VisualStyles.ScrollBarState.Pressed);
    //つまみの描画
    ScrollBarRenderer.DrawHorizontalThumb(g,
        new Rectangle(scrollBarRect.X + 40, scrollBarRect.Y,
            20, scrollBarRect.Height),
        System.Windows.Forms.VisualStyles.ScrollBarState.Normal);
    //つまみのグリップを描画
    ScrollBarRenderer.DrawHorizontalThumbGrip(g,
        new Rectangle(scrollBarRect.X + 40, scrollBarRect.Y,
            20, scrollBarRect.Height),
        System.Windows.Forms.VisualStyles.ScrollBarState.Normal);
    //矢印ボタンの描画
    ScrollBarRenderer.DrawArrowButton(g,
        new Rectangle(scrollBarRect.X, scrollBarRect.Y,
            17, scrollBarRect.Height),
        System.Windows.Forms.VisualStyles.ScrollBarArrowButtonState.LeftNormal);
    ScrollBarRenderer.DrawArrowButton(g,
        new Rectangle(scrollBarRect.X + scrollBarRect.Width - 17,
            scrollBarRect.Y, 17, scrollBarRect.Height),
        System.Windows.Forms.VisualStyles.ScrollBarArrowButtonState.RightHot);
}

//タブを描画する
if (TabRenderer.IsSupported)
{
    //大きさと位置を計算
    Rectangle tabRect = new Rectangle(120, 65, 100, 50);
    Rectangle tabItemRect = new Rectangle(tabRect.X, tabRect.Y, 50, 16);
    Rectangle tabPageRect = new Rectangle(
        tabRect.X, tabRect.Y + tabItemRect.Height,
        tabRect.Width, tabRect.Height - tabItemRect.Height);
    //タブページの描画
    TabRenderer.DrawTabPage(g, tabPageRect);
    //タブアイテムの描画
    TabRenderer.DrawTabItem(g, tabItemRect,
        "タブ1", PictureBox1.Font, false,
        System.Windows.Forms.VisualStyles.TabItemState.Selected);
}

//テキストボックスを描画する
if (TextBoxRenderer.IsSupported)
{
    Rectangle textBoxRect = new Rectangle(120, 125, 100, 19);
    TextFormatFlags textBoxFormat = TextFormatFlags.TextBoxControl;
    TextBoxRenderer.DrawTextBox(g, textBoxRect,
        "テキストボックス", PictureBox1.Font, textBoxFormat,
        System.Windows.Forms.VisualStyles.TextBoxState.Normal);
}

//トラックバーを描画する
if (TrackBarRenderer.IsSupported)
{
    //大きさと位置を計算
    Rectangle trackBarRect = new Rectangle(120, 150, 100, 5);
    Rectangle trackBarTrackRect = new Rectangle(
        trackBarRect.X + 8, trackBarRect.Y + 10,
        trackBarRect.Width - 16, 4);
    Rectangle trackBarTicksRect = new Rectangle(
        trackBarRect.X + 13, trackBarRect.Y + 25,
        trackBarRect.Width - 26, 4);
    Rectangle trackBarThumbRect = new Rectangle(
        trackBarRect.X + 8, trackBarRect.Y + 2,
        11, 21);
    //トラックの描画
    TrackBarRenderer.DrawHorizontalTrack(g, trackBarTrackRect);
    //目盛りの描画
    TrackBarRenderer.DrawHorizontalTicks(g, trackBarTicksRect, 11,
        System.Windows.Forms.VisualStyles.EdgeStyle.Raised);
    //つまみの描画
    TrackBarRenderer.DrawBottomPointingThumb(g, trackBarThumbRect,
        System.Windows.Forms.VisualStyles.TrackBarThumbState.Normal);
}

g.Dispose();

//PictureBox1に表示する
PictureBox1.Image = canvas;

上記のコードをWindows XPで実行すると、次のように表示されます。

Visualスタイルでコントロールを描画する

VisualStyleRendererクラスを使用する方法

今まで紹介したクラスは、visualスタイルでコントロールを描画する時、内部でVisualStyleRendererクラスを使用しています。かなり難易度は上がりますが、VisualStyleRendererクラスを直接使用すれば、上記の方法で描画できないコントロールや、コントロールの部分、状態も描画できます。

VisualStyleRendererクラスを使うには、まずどのコントロールのどの部品をどの状態で描画するか(どの要素を描画するか)を表すVisualStyleElementオブジェクトを取得して、それをVisualStyleRendererコンストラクタに渡します。VisualStyleElementクラスはたくさんの静的プロパティを持っており、これを使ってVisualStyleElementオブジェクトを取得することができます。例えば、スピンボタン(アップダウンコントロール)の上ボタンを押された状態で描画するならば、「VisualStyleElement.Spin.Up.Pressed」という静的プロパティで取得できるVisualStyleElementオブジェクトを使用します。

しかしVisualStyleElementクラスの静的プロパティとして用意されている要素はごく一部で、それ以外にも多くの要素を描画できます。そのような要素を描画したい場合は、VisualStyleRendererコンストラクタのもう一つのオーバーロードを使用します。こちらのコンストラクタには、描画するコントロールを表すクラス名(String型)、部品を表す値(Int32型)、状態を表す値(Int32型)の3つを渡します。この3つの値は、「Parts and States (Windows)」などで探すことができます。実際の値は、「Vsstyle.h」と「Vssym32.h」ファイルに記述されています。

補足:VisualStyleElement.CreateElementメソッドを使えば、これら3つの値からVisualStyleElementオブジェクトを作成することができます。

ただし、このように指定した要素が現在のvisualスタイルで定義されていない可能性もあります。そのような場合は、例外ArgumentExceptionがスローされます。ある要素が現在のvisualスタイルで定義されているか調べるには、VisualStyleRenderer.IsElementDefinedメソッドを使います。

このようにして指定した要素を実際に描画するには、VisualStyleRenderer.DrawBackgroundメソッドを呼び出します。

すでに存在しているVisualStyleRendererオブジェクトを使って別の要素を描画したい時は、VisualStyleRenderer.SetParametersメソッドで要素を変更することができます。SetParametersメソッドの使い方は、VisualStyleRendererコンストラクタと同じです。

VisualStyleRendererクラスを使って色々な要素を描画する例を以下に示します。

VB.NET
コードを隠すコードを選択
'Imports System.Drawing
'Imports System.Windows.Forms
'Imports System.Windows.Forms.VisualStyles

'描画先とするImageオブジェクトを作成する
Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
'ImageオブジェクトのGraphicsオブジェクトを作成する
Dim g As Graphics = Graphics.FromImage(canvas)

'VisualStyleRendererオブジェクトを作成する
'押された状態のボタンを描画する
Dim vsr As New VisualStyleRenderer( _
    VisualStyleElement.Button.PushButton.Pressed)
vsr.DrawBackground(g, New Rectangle(10, 10, 90, 20))

'無効状態のウィンドウの[閉じる]ボタンを描画する
vsr.SetParameters(VisualStyleElement.Window.CloseButton.Disabled)
vsr.DrawBackground(g, New Rectangle(10, 40, 20, 20))

'[開始]メニューのログオフボタンを描画する
vsr.SetParameters(VisualStyleElement.StartPanel.LogOffButtons.Normal)
vsr.DrawBackground(g, New Rectangle(10, 70, 80, 40))

'エクスプローラバーの[自動的に隠す]ボタンを描画する
vsr.SetParameters(VisualStyleElement.ExplorerBar.HeaderPin.Normal)
vsr.DrawBackground(g, New Rectangle(110, 10, 20, 20))

'DatePickerのDP_SHOWCALENDARBUTTONRIGHTをDPSCBR_NORMALで描画する
vsr.SetParameters("DATEPICKER", 3, 1)
vsr.DrawBackground(g, New Rectangle(110, 40, 30, 30))

'DragDropのDD_COPYをDDCOPY_HIGHLIGHTで描画する
Dim elem As VisualStyleElement = _
    VisualStyleElement.CreateElement("DRAGDROP", 1, 1)
vsr.SetParameters(elem)
vsr.DrawBackground(g, New Rectangle(110, 80, 30, 30))

g.Dispose()

'PictureBox1に表示する
PictureBox1.Image = canvas
C#
コードを隠すコードを選択
//using System.Drawing;
//using System.Windows.Forms;
//using System.Windows.Forms.VisualStyles;

//描画先とするImageオブジェクトを作成する
Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height);
//ImageオブジェクトのGraphicsオブジェクトを作成する
Graphics g = Graphics.FromImage(canvas);

//VisualStyleRendererオブジェクトを作成する
//押された状態のボタンを描画する
VisualStyleRenderer vsr =
    new VisualStyleRenderer(
        VisualStyleElement.Button.PushButton.Pressed);
vsr.DrawBackground(g, new Rectangle(10, 10, 90, 20));

//無効状態のウィンドウの[閉じる]ボタンを描画する
vsr.SetParameters(VisualStyleElement.Window.CloseButton.Disabled);
vsr.DrawBackground(g, new Rectangle(10, 40, 20, 20));

//[開始]メニューのログオフボタンを描画する
vsr.SetParameters(VisualStyleElement.StartPanel.LogOffButtons.Normal);
vsr.DrawBackground(g, new Rectangle(10, 70, 80, 40));

//エクスプローラバーの[自動的に隠す]ボタンを描画する
vsr.SetParameters(VisualStyleElement.ExplorerBar.HeaderPin.Normal);
vsr.DrawBackground(g, new Rectangle(110, 10, 20, 20));

//DatePickerのDP_SHOWCALENDARBUTTONRIGHTをDPSCBR_NORMALで描画する
vsr.SetParameters("DATEPICKER", 3, 1);
vsr.DrawBackground(g, new Rectangle(110, 40, 30, 30));

//DragDropのDD_COPYをDDCOPY_HIGHLIGHTで描画する
VisualStyleElement elem =
    VisualStyleElement.CreateElement("DRAGDROP", 1, 1);
vsr.SetParameters(elem);
vsr.DrawBackground(g, new Rectangle(110, 80, 30, 30));

g.Dispose();

//PictureBox1に表示する
PictureBox1.Image = canvas;

VisualStyleRendererクラスを使ってVisualスタイルでコントロールを描画する

  • 履歴:
  • 2012/8/4 表示する方法を、PictureBox.Imageプロパティを使った方法に変更。
  • 2013/11/25 VisualStyleRendererクラスを使用する方法を追加など。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。