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

コントロールを描画する

注意:.NET Framework 2.0以降で、visualスタイルでコントロールを描画する方法は、「Visualスタイルでコントロールを描画する」で説明しています。
注意:画像の表示方法が分からないという方は、まず「コントロールやフォームに画像を表示する」をご覧ください。

ボタンやチェックボックス、オプションボタンなどのコントロールの形を描画するためのメソッドが、ControlPaintクラスの静的メンバとして用意されています。さらに、コントロールの輪郭、グラブハンドルグリフ、フォームのサイズグリップ、グリッド、フォーカスを示す四角形、塗りつぶされた反転できる四角形などなどの描画も出来ます。

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

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

'ボタンコントロールの描画
ControlPaint.DrawButton(g, 10, 10, 50, 20, ButtonState.Normal)
'キャプションボタンコントロールの閉じるボタンの描画
ControlPaint.DrawCaptionButton(g, 10, 40, 15, 15, CaptionButton.Close, _
    ButtonState.Pushed)
'チェックボックスコントロールの描画
ControlPaint.DrawCheckBox(g, 30, 40, 15, 15, ButtonState.All)
'コンボボックスコントロールのドロップダウンボタンの描画
ControlPaint.DrawComboButton(g, 50, 40, 15, 15, ButtonState.Normal)
'オプションボタンコントロールの描画
ControlPaint.DrawRadioButton(g, 70, 40, 15, 15, ButtonState.Checked)
'スクロールバーコントロールのスクロールボタンの描画
ControlPaint.DrawScrollButton(g, 90, 40, 15, 15, ScrollButton.Max, _
    ButtonState.Checked)
'3ステートチェックボックスコントロールの描画
ControlPaint.DrawMixedCheckBox(g, 110, 40, 15, 15, ButtonState.Checked)
'メニュー項目のコントロールのチェックマークの描画
ControlPaint.DrawMenuGlyph(g, New Rectangle(130, 40, 15, 15), _
    MenuGlyph.Checkmark)

'ボタンスタイルコントロールの輪郭の描画
ControlPaint.DrawBorder(g, New Rectangle(10, 60, 50, 20), Color.White, _
    ButtonBorderStyle.Inset)
'コントロールの3Dスタイルの輪郭の描画
ControlPaint.DrawBorder3D(g, New Rectangle(70, 60, 50, 20), _
    Border3DStyle.Raised, Border3DSide.All)

'コンテナコントロールのグラブハンドルグリフの描画
ControlPaint.DrawContainerGrabHandle(g, New Rectangle(10, 90, 15, 15))
'標準の選択項目のグラブハンドルグリフの描画
ControlPaint.DrawGrabHandle(g, New Rectangle(30, 90, 15, 15), True, True)
'フォームのサイズグリップの描画
ControlPaint.DrawSizeGrip(g, Color.White, New Rectangle(50, 90, 15, 15))

'フォーカスを示す四角形の描画
ControlPaint.DrawFocusRectangle(g, New Rectangle(10, 110, 40, 40))
'1ピクセルの点線で構成されたグリッドの描画
ControlPaint.DrawGrid(g, New Rectangle(60, 110, 40, 40), New Size(8, 5), _
    Color.White)

'画面に表示されるロックされた選択項目の枠の描画
ControlPaint.DrawLockedFrame(g, New Rectangle(110, 110, 40, 40), True)
'標準の選択項目の枠の描画
ControlPaint.DrawSelectionFrame(g, True, New Rectangle(10, 160, 40, 40), _
    New Rectangle(20, 170, 20, 20), Color.White)

'.NET Framework 2.0以降:ビジュアルスタイルの輪郭の描画
'ControlPaint.DrawVisualStyleBorder(g, New Rectangle(10, 10, 100, 100))

'画面の反転できる枠を描画
ControlPaint.DrawReversibleFrame(New Rectangle(10, 210, 40, 40), _
    Color.White, FrameStyle.Thick)
'画面の反転できる線を描画
ControlPaint.DrawReversibleLine(New Point(60, 210), New Point(100, 250), _
    Color.White)
'画面上の塗りつぶされた反転できる四角形を描画
ControlPaint.FillReversibleRectangle(New Rectangle(110, 210, 40, 40), _
    Color.White)

'リソースを解放する
g.Dispose()

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

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

//ボタンコントロールの描画
ControlPaint.DrawButton(g, 10, 10, 50, 20, ButtonState.Normal);
//キャプションボタンコントロールの閉じるボタンの描画
ControlPaint.DrawCaptionButton(g, 10, 40, 15, 15,
    CaptionButton.Close, ButtonState.Pushed);
//チェックボックスコントロールの描画
ControlPaint.DrawCheckBox(g, 30, 40, 15, 15, ButtonState.All);
//コンボボックスコントロールのドロップダウンボタンの描画
ControlPaint.DrawComboButton(g, 50, 40, 15, 15, ButtonState.Normal);
//オプションボタンコントロールの描画
ControlPaint.DrawRadioButton(g, 70, 40, 15, 15, ButtonState.Checked);
//スクロールバーコントロールのスクロールボタンの描画
ControlPaint.DrawScrollButton(g, 90, 40, 15, 15, ScrollButton.Max,
    ButtonState.Checked);
//3ステートチェックボックスコントロールの描画
ControlPaint.DrawMixedCheckBox(g, 110, 40, 15, 15,
    ButtonState.Checked);
//メニュー項目のコントロールのチェックマークの描画
ControlPaint.DrawMenuGlyph(g, new Rectangle(130, 40, 15, 15),
    MenuGlyph.Checkmark);

//ボタンスタイルコントロールの輪郭の描画
ControlPaint.DrawBorder(g, new Rectangle(10, 60, 50, 20),
    Color.White, ButtonBorderStyle.Inset);
//コントロールの3Dスタイルの輪郭の描画
ControlPaint.DrawBorder3D(g, new Rectangle(70, 60, 50, 20),
    Border3DStyle.Raised, Border3DSide.All);

//.NET Framework 2.0以降:ビジュアルスタイルの輪郭の描画
//ControlPaint.DrawVisualStyleBorder(g, new Rectangle(10, 10, 100, 100));

//コンテナコントロールのグラブハンドルグリフの描画
ControlPaint.DrawContainerGrabHandle(g, new Rectangle(10, 90, 15, 15));
//標準の選択項目のグラブハンドルグリフの描画
ControlPaint.DrawGrabHandle(g, new Rectangle(30, 90, 15, 15),
    true, true);
//フォームのサイズグリップの描画
ControlPaint.DrawSizeGrip(g, Color.White,
    new Rectangle(50, 90, 15, 15));

//フォーカスを示す四角形の描画
ControlPaint.DrawFocusRectangle(g, new Rectangle(10, 110, 40, 40));
//1ピクセルの点線で構成されたグリッドの描画
ControlPaint.DrawGrid(g, new Rectangle(60, 110, 40, 40),
    new Size(8, 5), Color.White);

//画面に表示されるロックされた選択項目の枠の描画
ControlPaint.DrawLockedFrame(g, new Rectangle(110, 110, 40, 40), true);
//標準の選択項目の枠の描画
ControlPaint.DrawSelectionFrame(g, true, new Rectangle(10, 160, 40, 40),
    new Rectangle(20, 170, 20, 20), Color.White);

//画面の反転できる枠を描画
ControlPaint.DrawReversibleFrame(new Rectangle(10, 210, 40, 40),
    Color.White, FrameStyle.Thick);
//画面の反転できる線を描画
ControlPaint.DrawReversibleLine(new Point(60, 210), new Point(100, 250),
    Color.White);
//画面上の塗りつぶされた反転できる四角形を描画
ControlPaint.FillReversibleRectangle(new Rectangle(110, 210, 40, 40),
    Color.White);

//リソースを解放する
g.Dispose();

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

これらのメソッドのうち、DrawReversibleFrame、DrawReversibleLine、FillReversibleRectangleはちょっと特別です。これらのメソッドは、Graphicsオブジェクトを指定して描画するのではなく、画面に描画します。つまり、アプリケーションのフォーム上以外の場所に描画することもできます。そのため、指定する座標は、画面上の座標となります。クライアント座標を画面座標に変換するには、Control.PointToScreenメソッドを使います。詳しくは、「表示色を反転して線を引く」をご覧ください。

  • 履歴:
  • 2007/1/25 DrawVisualStyleBorderメソッドを追加。
  • 2012/8/4 表示する方法を、PictureBox.Imageプロパティを使った方法に変更。

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

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