Regionプロパティにより、フォームやコントロールの形を長方形(矩形)以外のいろいろな形に変えることができます。GraphicsPathクラスについて詳しくは、こちらにありますのでここでは説明せず、具体例を幾つかあげます。
補足:画像を使ってフォームの形を変える方法は、「自由な形のフォームを作成する」で紹介しています。
次の例ではフォーム(Form1)の形を平方四辺形にします。ここではフォームのLoadイベントハンドラ内にコードを書いていますが、もちろんフォームのコンストラクタ内などでも構いません。
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
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); }
次の例ではフォームの形を二重丸にします(ドーナッツ型)。
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
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!")にします。
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
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); }
さらには下の図のようななんとも言いようのない形にしてみましょう。
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
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の形をひし形にしています。
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
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); }