言語フィルタ:
概要
コントロールの詳細を描画する方法を紹介します。
楕円を描画すると次のようになります。
対象コントロール
- System.Windows.Forms.Control から派生しているクラス
解説
コントロールの詳細とは、テキストや枠線などの背景以外の部分のことです。
コントロールの詳細を描画するには OnPaint メソッドをオーバーライドする方法と Paint イベントを利用する方法があります。共に PaintEventArgs 引数の Graphics プロパティを使用して描画することで、コントロールの詳細を描画することが出来ます。
OnPaint メソッドは背景が描画された後に呼ばれます。そのため、コントロール全体を描画する場合は背景を描画する必要はありません。背景を描画すると、ちらつきの原因になってしまいます。背景を描画しないようにするには OnPaintBackground メソッドの中身を空の状態にするか、ControlStyles.Opaque スタイルを適用します。ControlStyles.Opaque スタイルを適用するにはコンストラクタで SetStyle メソッドを使用して True に設定します。
Public Sub New()
Me.SetStyle(ControlStyles.Opaque, True)
End Sub
public OwnerDraw() // コンストラクタ
{
this.SetStyle(ControlStyles.Opaque, true);
}
OnPaint メソッドと Paint イベントのどちらで描画すればいいか迷った場合は、OnPaint メソッドを使用します。通常、コントロールの UI に関する処理はそのコントロール自身に行わせるためです。Paint イベントは外部(フォームなど)からコントロールを描画したい時に利用するようにします。
一部のコントロールは OnPaint メソッドが呼ばれません。そのコントロールには別の手段で描画する方法が用意されている場合があります。詳細については、そのコントロールのページで紹介します。
ソースコード
Label コントロールに楕円を描画するサンプルを紹介します。
楕円の色には ForeColor プロパティを使用しています。
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
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);
}
}
}