Skip Navigation Linksホーム > ライブラリ > コントロール > コントロールの詳細を描画をする

コントロールの詳細を描画する

言語フィルタ:

概要

コントロールの詳細を描画する方法を紹介します。

楕円を描画すると次のようになります。

sample1

対象コントロール

  • System.Windows.Forms.Control から派生しているクラス

解説

コントロールの詳細とは、テキストや枠線などの背景以外の部分のことです。

コントロールの詳細を描画するには OnPaint メソッドをオーバーライドする方法と Paint イベントを利用する方法があります。共に PaintEventArgs 引数の Graphics プロパティを使用して描画することで、コントロールの詳細を描画することが出来ます。

OnPaint メソッドは背景が描画された後に呼ばれます。そのため、コントロール全体を描画する場合は背景を描画する必要はありません。背景を描画すると、ちらつきの原因になってしまいます。背景を描画しないようにするには OnPaintBackground メソッドの中身を空の状態にするか、ControlStyles.Opaque スタイルを適用します。ControlStyles.Opaque スタイルを適用するにはコンストラクタで SetStyle メソッドを使用して True に設定します。

展開されたイメージ ControlStyles.Opaque スタイルの適用 - Visual Basic
コピーイメージ コードのコピー
Public Sub New()
    Me.SetStyle(ControlStyles.Opaque, True)
End Sub
展開されたイメージ ControlStyles.Opaque スタイルの適用 - C#
コピーイメージ コードのコピー
public OwnerDraw() // コンストラクタ
{
    this.SetStyle(ControlStyles.Opaque, true);
}

OnPaint メソッドと Paint イベントのどちらで描画すればいいか迷った場合は、OnPaint メソッドを使用します。通常、コントロールの UI に関する処理はそのコントロール自身に行わせるためです。Paint イベントは外部(フォームなど)からコントロールを描画したい時に利用するようにします。

一部のコントロールは OnPaint メソッドが呼ばれません。そのコントロールには別の手段で描画する方法が用意されている場合があります。詳細については、そのコントロールのページで紹介します。

ソースコード

Label コントロールに楕円を描画するサンプルを紹介します。

楕円の色には ForeColor プロパティを使用しています。

展開されたイメージ Visual Basic
コピーイメージ コードのコピー
Imports System
Imports System.Drawing
Imports System.Windows.Forms

Namespace Extentions

    Public Class OwnerDraw
        Inherits System.Windows.Forms.Label

        Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
            Using p As New Pen(Me.ForeColor)
                Dim r As Rectangle = Me.ClientRectangle
                r.Width -= 1
                r.Height -= 1
                e.Graphics.DrawEllipse(p, r)
            End Using

            MyBase.OnPaint(e)
        End Sub

    End Class

End Namespace
展開されたイメージ C#
コピーイメージ コードのコピー
using System;
using System.Drawing;
using System.Windows.Forms;

namespace Extentions
{
    class OwnerDraw : System.Windows.Forms.Label
    {
        protected override void OnPaint(PaintEventArgs e)
        {
            using (Pen p = new Pen(this.ForeColor))
            {
                Rectangle r = this.ClientRectangle;
                r.Width -= 1;
                r.Height -= 1;
                e.Graphics.DrawEllipse(p, r);
            }

            base.OnPaint(e);
        }

    }
}