2009-08-05 9 views
4

PictureBoxがレイヤーとして使用されているため、PictureBoxが重複して表示されています。初めてPictureBoxが定義され、背景色が のパネルに追加され、その画像は空です。Overlapped PictureBoxのC#での透明度の問題

問題は、下部のレイヤーが見えない、透明な画像です、 パネルのグラウンドを示しています。例外は、下部のPictureBoxの画像が見られるということです。

私はラベルのような他のコントロールで試してみました。問題を解決することができませんでした:(私の記憶が正しければ、透明の背景色を(その実際の値は右、nullである?)設定することが本当に透明ではない、ので

感謝。

+0

これは従うことが少し難しいです。私はあなたがそれを違う方法で説明すれば、あなたはいくつかの答えを得るかもしれないと思います。 –

答えて

11

はこれがありますコントロールの親コンテナの背景色を設定してコントロールの背景色を設定しているのはWindowsの機能です

これは特にパネルで起こることがありますが、内容がなければ透明に設定されたパネルでは、右?間違った。あなたはTextBoxコントロール、たとえば、の束の上にパネルを入れて透明にパネルを設定した場合、あなたがSEにできなくなりますそれの背後にあるテキストボックス。

代わりに、本当の透明性を得るには、問題のコントロールのためにOnPaintBackgroundをオーバーロードする必要があります。基本的には何もしないでください(base.OnPainBackgroundを呼び出さないでください)...それ以上に、私たちは、Windowsのアプリケーションフォーム、過去に真に透明のパネルを作成するために、正常にこのクラスを使用しました

public class TransparentPanel : System.Windows.Forms.Panel 
{ 
    [Browsable(false)] 
    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle |= 0x20; 
      return cp; 
     } 
    } 
    protected override void OnPaintBackground(PaintEventArgs e) 
    { 
     // Do Nothing 
    } 
} 

:おそらく、しかし、ここでは、私たちがここで使う作業TransparentPanel制御の一例です。私たちは、 "右クリックのコンテキストメニューがボタンコントロールの上に表示される"という問題を解決するためにハックとして使用しました。

+0

私はこれを呼び出すことができますどのように、あなたが(それは我々が何をすべきかだ)を参照コントロールライブラリプロジェクトに上記のクラスを置くことができる – user335160

+0

のWinformsで透明パネルを作成するか、あなたはまた、単に.csファイルとして直接あなたのプロジェクトでそれを持つことができますファイル。あなたが追加しない限り、あなたのツールボックスには表示されません。それでも、通常のパネルをデザイン領域にドラッグし、designer.csファイルを開き、オブジェクトを特別なTransparentPanelに手動で変更することができます。 –

+1

public const int WS_EX_TRANSPARENT = 0x20; cp.ExStyle | = WS_EX_TRANSPARENT; – Hbas

5

これは、それが私の感想です:

class TransPictureBox : Control 
{ 
    private Image _image = null; 

    public Image Image 
    { 
     get 
     { 
      return _image; 
     } 
     set 
     { 
      _image = value; 
     } 
    } 
    public TransPictureBox() 
    { 
    } 

    protected override void OnPaintBackground(PaintEventArgs pevent) 
    { 
    } 

    protected override void OnPaint(PaintEventArgs pe) 
    { 
     if(Image != null) 
      pe.Graphics.DrawImage(Image, 0, 0); 
    } 
    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle |= 0x20; 
      return cp; 
     } 
    } 
} 

あなたが望むように画像を配置するためのいくつかのより多くのロジックを追加し、それに応じてのOnPaintメソッドを編集する必要があります。

0

あなたはそう、あなたのイメージは、私がVBでこれを行うことができました

2

を随分されることはありません

pe.Graphics.DrawImage(Image, 0, 0, Image.Width, Image.Height); 

を行う必要があります。しかし、いくつかのトリックがあります。まず、ピクチャボックスを互いに追加する必要があります。次に、画像ボックス内の画像はPNGでなければなりません。私は背景レイヤーの上に3つの異なる層を表示し、チェックボックスをオンとオフにそれらを回すために持っていた、このアプリのために

。それが動作しない場合は、あなたがあなたのPNG画像を保存する方法で遊んで、それは一種のうるさいことについてです。

Imports System.Drawing 
Imports System.Drawing.Imaging 
Imports System 

Public Class Form1 

    Dim MarkerBox1 As New PictureBox 
    Dim MarkerBox2 As New PictureBox 
    Dim MarkerBox3 As New PictureBox 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     PictureBox1.Image = New Bitmap("C:\BackGround.bmp") 

     MarkerBox1.Image = New Bitmap("C:\TestOverlay1.png") 
     MarkerBox1.BackColor = System.Drawing.Color.Transparent 
     MarkerBox1.Visible = True 
     MarkerBox1.SizeMode = PictureBoxSizeMode.AutoSize 
     PictureBox1.Controls.Add(MarkerBox1) 

     MarkerBox2.Image = New Bitmap("C:\TestOverlay2.png") 
     MarkerBox2.BackColor = System.Drawing.Color.Transparent 
     MarkerBox2.Visible = True 
     MarkerBox2.SizeMode = PictureBoxSizeMode.AutoSize 
     MarkerBox1.Controls.Add(MarkerBox2) 

     MarkerBox3.Image = New Bitmap("C:\TestOverlay3.png") 
     MarkerBox3.BackColor = System.Drawing.Color.Transparent 
     MarkerBox3.Visible = True 
     MarkerBox3.SizeMode = PictureBoxSizeMode.AutoSize 
     MarkerBox2.Controls.Add(MarkerBox3) 


    End Sub 

    Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged 
     If CheckBox1.Checked Then 
      MarkerBox1.Visible = True 
     Else 
      MarkerBox1.Visible = False 
     End If 
     Visibilitychanged() 
    End Sub 

    Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged 
     If CheckBox2.Checked Then 
      MarkerBox2.Visible = True 
     Else 
      MarkerBox2.Visible = False 
     End If 
     Visibilitychanged() 
    End Sub 

    Private Sub CheckBox3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox3.CheckedChanged 
     If CheckBox3.Checked Then 
      MarkerBox3.Visible = True 
     Else 
      MarkerBox3.Visible = False 
     End If 
     Visibilitychanged() 
    End Sub 

    Private Sub Visibilitychanged() 

     PictureBox1.Controls.Clear() 
     MarkerBox1.Controls.Clear() 
     MarkerBox2.Controls.Clear() 
     MarkerBox3.Controls.Clear() 

     Dim PB As PictureBox = PictureBox1 
     If MarkerBox1.Visible Then 
      PB.Controls.Add(MarkerBox1) 
      PB = MarkerBox1 
     End If 
     If MarkerBox2.Visible Then 
      PB.Controls.Add(MarkerBox2) 
      PB = MarkerBox2 
     End If 
     If MarkerBox3.Visible Then 
      PB.Controls.Add(MarkerBox3) 
      PB = MarkerBox3 
     End If 

    End Sub 
+0

熱いくそー、これは実際に動作します!ただし、PictureBoxSizeMode.Zoom **は動作しません。ベースイメージが親コンテナに拡大縮小できる場合は、子ピクチャボックスのサイズを手動で設定する必要があります。 –