フォームのTransparencyKeyプロパティにより、フォームで透明にしたい色を指定できます。透明な部分は穴が開いたようになり、その下のウィンドウの操作が出来ます。ただし、透明なウィンドウおよび領域はWindows2000以降でだけサポートされているため、Windows98などでは無視されます。下の図はフォームの背景色を赤にしてTransparencyKeyに赤を指定した時のものです。
このTransparencyKeyを使うことにより、簡単に自由な形のフォームを作ることも可能になります。つまり、フォームの形としたい形で描いた画像ファイルを用意し、フォームにその画像を描画し、画像の背景色をフォームのTransparencyKeyに指定すればよいのです。
例を示しましょう。まずフォームの形となる画像を作成します。ここでは透明となる部分を白とし、フォームのそれ以外のフォームの形となる部分を白以外の色で塗ります。この画像を「form.bmp」として保存し、フォームのBackgroundImageに設定します。そしてTransparencyKeyを白にすればよいのです。これをコードで書けば、こんな感じです(Form1_LoadはフォームのLoadイベントハンドラです)。
Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'フォームの境界線をなくす Me.FormBorderStyle = FormBorderStyle.None '大きさを適当に変更 Me.Size = New Size(100, 100) '背景画像を指定する Me.BackgroundImage = Image.FromFile("form.bmp") '透明を指定する Me.TransparencyKey = Color.White End Sub
private void Form1_Load(object sender, System.EventArgs e) { //フォームの境界線をなくす this.FormBorderStyle = FormBorderStyle.None; //大きさを適当に変更 this.Size = new Size(100, 100); //背景画像を指定する this.BackgroundImage = Image.FromFile(@"form.bmp"); //透明を指定する this.TransparencyKey = Color.White; }
しかし実際にはそう簡単にいかないケースもあります。私の試したところでは、Windowsの設定で「画面のプロパティ」の「画面の色」が「High Color(16ビット)」以下になっている時はうまく行きますが、「True Color(32ビット)」の時はTransparencyKeyに指定した色も透明になりませんでした。
しかし少なくとも私の環境では次のような方法により、True Colorの時でも成功するようになりました。まずフォームの背景色を透明にしたい色にして、さらにフォームのTransparencyKeyにもその色を指定します。フォームの形に使う画像ファイルはBitmapオブジェクトとして読み込み、MakeTransparentメソッドにより、先ほどの色を透明色として指定します。(または透明色を指定して保存したGif画像を使うという手もあります。)画像をフォームに描画するには、BackgroundImageプロパティに指定するのではなく、フォームのPaintイベントハンドラで描画するようにします。
次の例ではフォームの形を"form.bmp"という画像ファイルに保存し、これを使ってフォームForm1の形を作っています。ここでは白を透明色としています。(Form1_PaintはフォームのPaintイベントハンドラです)
Dim _formBitmap As Bitmap Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'TransparencyKeyプロパティを指定する前に画像を読み込む 'フォームの形の画像を読み込む _formBitmap = New Bitmap("form.bmp") '画像の透明色を指定する _formBitmap.MakeTransparent(Color.White) 'フォームの境界線をなくす Me.FormBorderStyle = FormBorderStyle.None '大きさを適当に変更 Me.Size = New Size(100, 100) '透明を指定する Me.TransparencyKey = Color.White 'フォームの背景色を透明色にする Me.BackColor = Color.White End Sub Private Sub Form1_Paint(ByVal sender As Object, _ ByVal e As System.Windows.Forms.PaintEventArgs) _ Handles MyBase.Paint 'フォームの形の画像を描画する e.Graphics.DrawImage(_formBitmap, 0, 0) End Sub
Bitmap _formBitmap; private void Form1_Load(object sender, System.EventArgs e) { //TransparencyKeyプロパティを指定する前に画像を読み込む //フォームの形の画像を読み込む _formBitmap = new Bitmap(@"form.bmp"); //画像の透明色を指定する _formBitmap.MakeTransparent(Color.White); //フォームの境界線をなくす this.FormBorderStyle = FormBorderStyle.None; //大きさを適当に変更 this.Size = new Size(100, 100); //透明を指定する this.TransparencyKey = Color.White; //フォームの背景色を透明色にする this.BackColor = Color.White; } private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { //フォームの形の画像を描画する e.Graphics.DrawImage(_formBitmap, 0, 0); }
マイクロソフトのサポート技術情報にこの問題の解決法が追加されました。この方法によると、次のようになります。
Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'フォームの境界線をなくす Me.FormBorderStyle = FormBorderStyle.None '大きさを適当に変更 Me.Size = New Size(100, 100) '画像を読み込む Dim bmp As New Bitmap("form.bmp") '透明にする色 Dim transColor As Color = bmp.GetPixel(0, 0) '画像を透明にする bmp.MakeTransparent(transColor) '背景画像を指定する Me.BackgroundImage = bmp '背景色を指定する Me.BackColor = transColor '透明を指定する Me.TransparencyKey = transColor End Sub
//フォームのLoadイベントハンドラ private void Form1_Load(object sender, EventArgs e) { //フォームの境界線をなくす this.FormBorderStyle = FormBorderStyle.None; //大きさを適当に変更 this.Size = new Size(100, 100); //画像を読み込む Bitmap bmp = new Bitmap(@"form.bmp"); //透明にする色 Color transColor = bmp.GetPixel(0, 0); //画像を透明にする bmp.MakeTransparent(transColor); //背景画像を指定する this.BackgroundImage = bmp; //背景色を指定する this.BackColor = transColor; //透明を指定する this.TransparencyKey = transColor; }