注意:画像の表示方法が分からないという方は、まず「コントロールやフォームに画像を表示する」をご覧ください。また、塗りつぶした図形の描画法については、「塗りつぶした図形を描く」をご覧ください。
Regionオブジェクトが表す領域を、Graphics.FillRegionメソッドで塗りつぶすことが出来ます。Regionオブジェクトは四角形とパスで構成されるグラフィックス形状の内部を示します。Regionオブジェクトに領域を追加、あるいは削除するには、Union、Intersect、Exclude、Xorといったメソッドを使用します。
これらのメソッドの違いを理解するため、次のようなコードを書いてみました。ここではまず2つのRectangle構造体を用意し、この2つの領域からUnion、Intersect、Exclude、Xorメソッドを使用してRegionオブジェクトを作ります。2つのRectangle構造体をそれぞれ青と緑で塗りつぶした後、Regionオブジェクトの領域を黒で塗りつぶしていますので、結果を見ればそれぞれのメソッドの効果がよく分かるでしょう。
'Imports System.Drawing 'Imports System.Drawing.Drawing2D 'がソースファイルの一番上に書かれているものとする '描画先とするImageオブジェクトを作成する Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height) 'ImageオブジェクトのGraphicsオブジェクトを作成する Dim g As Graphics = Graphics.FromImage(canvas) Dim rgn As [Region] Dim rect1, rect2 As Rectangle 'Regionで使用する2つの領域 rect1 = New Rectangle(0, 0, 40, 40) rect2 = New Rectangle(20, 20, 40, 40) 'rect1を青で塗る g.FillRectangle(Brushes.Blue, rect1) 'rect2を緑で塗る g.FillRectangle(Brushes.Green, rect2) 'rect1でRegionを作成 rgn = New [Region](rect1) 'Union(和集合)によりrect2を追加 rgn.Union(rect2) '出来上がったRegionを黒で描画 g.FillRegion(Brushes.Black, rgn) 'rect1とrect2の位置を変更 rect1.Y = rect2.Bottom + 10 rect2.Y = rect1.Y + 20 'rect1を青で塗る g.FillRectangle(Brushes.Blue, rect1) 'rect2を緑で塗る g.FillRectangle(Brushes.Green, rect2) 'rect1でRegionを作成 rgn = New [Region](rect1) 'Intersect(交差部分)によりrect2を追加 rgn.Intersect(rect2) '出来上がったRegionを黒で描画 g.FillRegion(Brushes.Black, rgn) 'rect1とrect2の位置を変更 rect1.Y = rect2.Bottom + 10 rect2.Y = rect1.Y + 20 'rect1を青で塗る g.FillRectangle(Brushes.Blue, rect1) 'rect2を緑で塗る g.FillRectangle(Brushes.Green, rect2) 'rect1でRegionを作成 rgn = New [Region](rect1) 'Exclude(交差しない内部の部分)によりrect2を追加 rgn.Exclude(rect2) '出来上がったRegionを黒で描画 g.FillRegion(Brushes.Black, rgn) 'rect1とrect2の位置を変更 rect1.Y = rect2.Bottom + 10 rect2.Y = rect1.Y + 20 'rect1を青で塗る g.FillRectangle(Brushes.Blue, rect1) 'rect2を緑で塗る g.FillRectangle(Brushes.Green, rect2) 'rect1でRegionを作成 rgn = New [Region](rect1) 'Xor(交差部分を差し引いた和集合)によりrect2を追加 rgn.Xor(rect2) '出来上がったRegionを黒で描画 g.FillRegion(Brushes.Black, rgn) 'リソースを解放する g.Dispose() 'PictureBox1に表示する PictureBox1.Image = canvas
//using System.Drawing; //using System.Drawing.Drawing2D; //がソースファイルの一番上に書かれているものとする //描画先とするImageオブジェクトを作成する Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height); //ImageオブジェクトのGraphicsオブジェクトを作成する Graphics g = Graphics.FromImage(canvas); Region rgn; Rectangle rect1, rect2; //Regionで使用する2つの領域 rect1 = new Rectangle(0, 0, 40, 40); rect2 = new Rectangle(20, 20, 40, 40); //rect1を青で塗る g.FillRectangle(Brushes.Blue, rect1); //rect2を緑で塗る g.FillRectangle(Brushes.Green, rect2); //rect1でRegionを作成 rgn = new Region(rect1); //Union(和集合)によりrect2を追加 rgn.Union(rect2); //出来上がったRegionを黒で描画 g.FillRegion(Brushes.Black, rgn); //rect1とrect2の位置を変更 rect1.Y = rect2.Bottom + 10; rect2.Y = rect1.Y + 20; //rect1を青で塗る g.FillRectangle(Brushes.Blue, rect1); //rect2を緑で塗る g.FillRectangle(Brushes.Green, rect2); //rect1でRegionを作成 rgn = new Region(rect1); //Intersect(交差部分)によりrect2を追加 rgn.Intersect(rect2); //出来上がったRegionを黒で描画 g.FillRegion(Brushes.Black, rgn); //rect1とrect2の位置を変更 rect1.Y = rect2.Bottom + 10; rect2.Y = rect1.Y + 20; //rect1を青で塗る g.FillRectangle(Brushes.Blue, rect1); //rect2を緑で塗る g.FillRectangle(Brushes.Green, rect2); //rect1でRegionを作成 rgn = new Region(rect1); //Exclude(交差しない内部の部分)によりrect2を追加 rgn.Exclude(rect2); //出来上がったRegionを黒で描画 g.FillRegion(Brushes.Black, rgn); //rect1とrect2の位置を変更 rect1.Y = rect2.Bottom + 10; rect2.Y = rect1.Y + 20; //rect1を青で塗る g.FillRectangle(Brushes.Blue, rect1); //rect2を緑で塗る g.FillRectangle(Brushes.Green, rect2); //rect1でRegionを作成 rgn = new Region(rect1); //Xor(交差部分を差し引いた和集合)によりrect2を追加 rgn.Xor(rect2); //出来上がったRegionを黒で描画 g.FillRegion(Brushes.Black, rgn); //リソースを解放する g.Dispose(); //PictureBox1に表示する PictureBox1.Image = canvas;