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

フォームやコントロールの形を変える

Regionプロパティにより、フォームやコントロールの形を長方形(矩形)以外のいろいろな形に変えることができます。GraphicsPathクラスについて詳しくは、こちらにありますのでここでは説明せず、具体例を幾つかあげます。

補足:画像を使ってフォームの形を変える方法は、「自由な形のフォームを作成する」で紹介しています。

フォームを平方四辺形にする

次の例ではフォーム(Form1)の形を平方四辺形にします。ここではフォームのLoadイベントハンドラ内にコードを書いていますが、もちろんフォームのコンストラクタ内などでも構いません。

VB.NET
コードを隠すコードを選択
Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
    'フォームのサイズを適当に変更
    Me.SetBounds(Me.Left, Me.Top, 201, 101, _
                    BoundsSpecified.Size)
    '多角形の頂点の位置を設定
    Dim points() As Point = _
        {New Point(0, 0), _
        New Point(100, 100), _
        New Point(200, 100), _
        New Point(100, 0)}
    Dim types() As Byte = _
        {Drawing.Drawing2D.PathPointType.Line, _
        Drawing.Drawing2D.PathPointType.Line, _
        Drawing.Drawing2D.PathPointType.Line, _
        Drawing.Drawing2D.PathPointType.Line}
    'GraphicsPathの作成
    Dim path As New Drawing2D.GraphicsPath(points, types)
    '形を変更
    Me.Region = New Region(path)
End Sub
C#
コードを隠すコードを選択
private void Form1_Load(object sender, System.EventArgs e)
{
    //フォームのサイズを適当に変更
    this.SetBounds(this.Left, this.Top, 201, 101,
                    BoundsSpecified.Size);
    //多角形の頂点の位置を設定
    Point[] points =
        {new Point(0, 0), 
        new Point(100, 100),
        new Point(200, 100),
        new Point(100, 0)};
    byte[] types =
        {(byte) System.Drawing.Drawing2D.PathPointType.Line,
        (byte) System.Drawing.Drawing2D.PathPointType.Line,
        (byte) System.Drawing.Drawing2D.PathPointType.Line,
        (byte) System.Drawing.Drawing2D.PathPointType.Line};
    //GraphicsPathの作成
    System.Drawing.Drawing2D.GraphicsPath path =
        new System.Drawing.Drawing2D.GraphicsPath(points, types);
    //形を変更
    this.Region = new Region(path);
}

フォームをドーナッツ型にする

次の例ではフォームの形を二重丸にします(ドーナッツ型)。

VB.NET
コードを隠すコードを選択
Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
    Me.SetBounds(Me.Left, Me.Top, 301, 301, _
                    BoundsSpecified.Size)
    Dim path As New System.Drawing.Drawing2D.GraphicsPath()
    '丸を描く
    path.AddEllipse(New Rectangle(0, 0, 300, 300))
    '真ん中を丸くくりぬく
    path.AddEllipse(New Rectangle(100, 100, 100, 100))
    Me.Region = New Region(path)
End Sub
C#
コードを隠すコードを選択
private void Form1_Load(object sender, System.EventArgs e)
{
    this.SetBounds(this.Left, this.Top, 301, 301,
                    BoundsSpecified.Size);
    System.Drawing.Drawing2D.GraphicsPath path =
        new System.Drawing.Drawing2D.GraphicsPath();
    //丸を描く
    path.AddEllipse(new Rectangle(0, 0, 300, 300));
    //真ん中を丸くくりぬく
    path.AddEllipse(new Rectangle(100, 100, 100, 100));
    this.Region = new Region(path);
}

フォームを文字の形にする

さらに次の例ではフォームの形を文字(この例では"DOBON!")にします。

VB.NET
コードを隠すコードを選択
Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
    Dim path As New System.Drawing.Drawing2D.GraphicsPath()
    '文字のサイズは50
    path.AddString("DOBON!", New FontFamily("Arial"), _
        FontStyle.Bold, 50, New Point(0, 0), _
        StringFormat.GenericDefault)
    Me.Region = New Region(path)
End Sub
C#
コードを隠すコードを選択
private void Form1_Load(object sender, System.EventArgs e)
{
    System.Drawing.Drawing2D.GraphicsPath path =
        new System.Drawing.Drawing2D.GraphicsPath();
    //文字のサイズは50
    path.AddString("DOBON!", new FontFamily("Arial"),
        (int) FontStyle.Bold, 50, new Point(0, 0),
        StringFormat.GenericDefault);
    this.Region = new Region(path);
}

フォームを変な曲線の形にする

さらには下の図のようななんとも言いようのない形にしてみましょう。

VB.NET
コードを隠すコードを選択
Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
    '閉じた曲線を追加
    Dim myArray As Point() = _
        {New Point(20, 100), _
        New Point(40, 150), _
        New Point(60, 125), _
        New Point(40, 100), _
        New Point(60, 75), _
        New Point(40, 50)}
    Dim path As New System.Drawing.Drawing2D.GraphicsPath()
    path.AddClosedCurve(myArray, 0.5F)
    '形を変更
    Me.Region = New Region(path)
End Sub
C#
コードを隠すコードを選択
private void Form1_Load(object sender, System.EventArgs e)
{
    //閉じた曲線を追加
    Point[] myArray = {
        new Point(20, 100),
        new Point(40, 150),
        new Point(60, 125),
        new Point(40, 100),
        new Point(60, 75),
        new Point(40, 50)};
    System.Drawing.Drawing2D.GraphicsPath path =
        new System.Drawing.Drawing2D.GraphicsPath();
    path.AddClosedCurve(myArray, 0.5F);
    //形を変更
    this.Region = new Region(path);
}

コントロールの形を変える

同様にしてコントロールの形も変えることができます。次の例ではボタンコントロールButton1の形をひし形にしています。

VB.NET
コードを隠すコードを選択
Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
    'コントロールのサイズを適当に変更
    Button1.SetBounds(0, 0, 101, 101)
    '多角形の頂点の位置を設定
    Dim points() As Point = _
        {New Point(0, 0), _
        New Point(50, 50), _
        New Point(100, 50), _
        New Point(50, 0)}
    Dim types() As Byte = _
        {Drawing.Drawing2D.PathPointType.Line, _
        Drawing.Drawing2D.PathPointType.Line, _
        Drawing.Drawing2D.PathPointType.Line, _
        Drawing.Drawing2D.PathPointType.Line}
    'GraphicsPathの作成
    Dim path As New Drawing2D.GraphicsPath(points, types)
    'コントロールの形を変更
    Button1.Region = New Region(path)
End Sub
C#
コードを隠すコードを選択
private void Form1_Load(object sender, System.EventArgs e)
{
    //コントロールのサイズを適当に変更
    Button1.SetBounds(0, 0, 101, 101);
    //多角形の頂点の位置を設定
    Point[] points = {
        new Point(0, 0),
        new Point(50, 50),
        new Point(100, 50),
        new Point(50, 0)};
    byte[] types =
        {(byte) System.Drawing.Drawing2D.PathPointType.Line,
        (byte) System.Drawing.Drawing2D.PathPointType.Line,
        (byte) System.Drawing.Drawing2D.PathPointType.Line,
        (byte) System.Drawing.Drawing2D.PathPointType.Line};
    //GraphicsPathの作成
    System.Drawing.Drawing2D.GraphicsPath path =
        new System.Drawing.Drawing2D.GraphicsPath(points, types);
    //コントロールの形を変更
    Button1.Region = new Region(path);
}
  • 履歴:
  • 2010/8/31 「フォームを変な曲線の形にする」のVB.NETのコードで、行の最後に"_"が抜けている箇所があったのを修正。

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

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。