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

フォームウィンドウの特定の色を透明にする

フォームのTransparencyKeyプロパティにより、フォームで透明にしたい色を指定できます。透明な部分は穴が開いたようになり、その下のウィンドウの操作が出来ます。ただし、透明なウィンドウおよび領域はWindows2000以降でだけサポートされているため、Windows98などでは無視されます。下の図はフォームの背景色を赤にしてTransparencyKeyに赤を指定した時のものです。

自由な形のフォームを作成する

このTransparencyKeyを使うことにより、簡単に自由な形のフォームを作ることも可能になります。つまり、フォームの形としたい形で描いた画像ファイルを用意し、フォームにその画像を描画し、画像の背景色をフォームのTransparencyKeyに指定すればよいのです。

例を示しましょう。まずフォームの形となる画像を作成します。ここでは透明となる部分を白とし、フォームのそれ以外のフォームの形となる部分を白以外の色で塗ります。この画像を「form.bmp」として保存し、フォームのBackgroundImageに設定します。そしてTransparencyKeyを白にすればよいのです。これをコードで書けば、こんな感じです(Form1_LoadはフォームのLoadイベントハンドラです)。

VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
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イベントハンドラです)

VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
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);
}

別の方法

マイクロソフトのサポート技術情報にこの問題の解決法が追加されました。この方法によると、次のようになります。

VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
//フォームの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;
}
  • 履歴:
  • 2007/3/12 サポート技術情報にある方法を追加。(コメントにてご報告いただきました。)
  • 2007/9/2 「別の方法」でフォームのバックカラーも変更するようにした。(コメントにてご報告いただきました。)

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

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