WisdomSoft - for your serial experiences.

5.5 特殊な形のフォーム

複雑な形状のフォームを表示します。フォームは指定した色の部分を透過でき、透明にしたい領域の描画にパスやリージョンを用いることで特殊な形状のフォームを表現できます。

5.5.1 フォームの一部を透明にする

Opacity プロパティはフォーム全体を一定の割合で半透明に設定することができましたが、ウィンドウの一部だけを透明にしたいという要求をかなえることはできません。例えば、丸い形のフォームやフォームの内部の一部分だけがくり抜かれているような特殊な形のフォームを作りたい場合、Opacity プロパティは使えません。

フォームの一部分だけを透明にするには Form クラスの TransparencyKey プロパティを使います。

Form クラス TransparencyKey プロパティ
public Color TransparencyKey { get; set; }

このプロパティには、フォーム上の透明色を表す Color オブジェクトを設定します。フォーム上で TransparencyKey に設定されている色が描画された場合、その色は透明色として扱われます。透明部分はフォームの背景が表示されます。Graphics オブジェクトからフォームに描画した図形も TransparencyKey と同じ色の場合は透明になるので注意してください。

さらに、TransparencyKey プロパティが BackColor プロパティと同色の場合、背景領域は単純な透明ではなくマウスイベントを透明領域の下のウィンドウに転送します。つまり、透明領域はウィンドウがないものとして扱われるのです。

コード1
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

public class Test : Form
{
	protected override void OnPaint(PaintEventArgs e)
	{
		base.OnPaint (e);
		GraphicsPath path = new GraphicsPath();
		path.AddEllipse(0, 0, ClientSize.Width, ClientSize.Height);

		Region region = new Region(ClientRectangle);
		region.Xor(path);

		Brush brush = new SolidBrush(Color.White);
		e.Graphics.FillRegion(brush, region);
	}

	static void Main() 
	{
		Form form = new Test();
		form.TransparencyKey = form.BackColor;
		Application.Run(form);
	}
}
実行結果
コード1 実行結果

コード1は、クライアント領域の中央が大きな楕円でくり貫かれている特殊な形のフォームを表示します。この楕円は単純な透明領域ではなく、ウィンドウがない状態として扱われます。くり抜かれている中央の透明領域をクリックすると、マウスイベントは背景にあるウィンドウに転送されるためフォーカスが移動します。

Opacity プロパティと同様に、透明なウィンドウおよび領域は Windows 2000 以降からのサポートとなるため、古いシステムでは透明に表示されないことがあります。