2012-03-11 48 views
5

イメージを別のイメージの上に表示し、透明な背景でイメージを表示しようとしています。私はそれを持っているので、新しい画像が他のものの上に表示されますが、BackColorをColor.Transparentに設定すると黒い背景になります。透明な背景が黒く表示される

全コード:

public partial class frm_airportApplication : Form 
{ 
    PictureBox PicBox; 
    public frm_airportApplication() 
    { 
     InitializeComponent(); 
    } 
    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle |= 0x000000200; 
      return cp; 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     AllowTransparency = true; 
     plane p = new plane(); 
     p.getPB().Parent = pb_airport; 
     this.Controls.Add(p.getPB()); 
     this.Update(); 
    } 
    protected void InvalidateEx() 
    { 
     if (Parent == null) 
      return; 
     Rectangle rc = new Rectangle(this.Location, this.Size); 
     Parent.Invalidate(rc, true); 
    } 
    protected override void OnPaintBackground(PaintEventArgs pevent) 
    { 
     //do not allow the background to be painted 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     AllowTransparency = true; 
     ResourceManager resourceManager = new ResourceManager("Airport_Application.Properties.Resources", GetType().Assembly); 
     PicBox = new PictureBox(); 
     PicBox.BackColor = Color.Transparent; 
     PicBox.Image = (Bitmap)resourceManager.GetObject("plane_icon"); 
     PicBox.Top = 100; 
     PicBox.Width = 120; 
     PicBox.Height = 120; 
     PicBox.Left = 10; 
     PicBox.SizeMode = PictureBoxSizeMode.Zoom; 

     PicBox.Parent = pb_airport; 
     Controls.Add(PicBox); 
     PicBox.BringToFront(); 
    } 
} 
public class plane 
{ 
    PictureBox pb; 
    Bitmap image; 
    ResourceManager resourceManager; 
    public plane() 
    { 
     resourceManager = new ResourceManager("Airport_Application.Properties.Resources", GetType().Assembly); 
     image=(Bitmap)resourceManager.GetObject("plane_icon"); 
     pb = new PictureBox(); 
     pb.Image = image; 
     pb.Top = 500; 
     pb.Width = 100; 
     pb.Height = 100; 
     pb.Left = 50; 
     pb.SizeMode = PictureBoxSizeMode.Zoom; 
     pb.BackColor = Color.Transparent; 
    } 
    public PictureBox getPB() 
    { 
     return pb; 
    } 
} 

私は同様の問題があったが、解決策のどれも助けなかった多くの人々を見つけました。

+1

はい、あなたが考えているように、それは実際にはWinFormsには存在しません。 –

+0

確かに。私はあまりにも長い間同じ事に苦労してきただけで、wpfがほとんど何の努力もせずにそれを行うことができることを知るだけです。 – Silvermind

答えて

0

簡単に言えば、Windowsフォームの既定のPictureBoxコントロールを使用して透明度を簡単に達成することはできません。

WPFに切り替えると、デフォルトで各ビットの透明度がサポートされるか、カスタムコントロールが使用されます。あなたは(フォーム上ではなく、画像)画像の上に画像をオーバーレイしたい場合は、私はAPPICONと呼ばれるこのような制御を作成したが、それはGPLの下でリリースされ、

http://mymobilepack.codeplex.com/SourceControl/changeset/view/39314#512415

enter image description here

0

フォームについてあなたはこれを試すことができます。

は、ビットマップ形式の画像を作成し、この方法ではtransparantのbackgroundColorます:

 this.BackColor = System.Drawing.Color.XXX; 
     this.TransparencyKey = System.Drawing.Color.XXX; 

あなたはビットマップレベルでそれを解決しようとすることができます

 bm.MakeTransparent(Color.XXX); 

私のスプラッシュスクリーンのbijで、タイマーを100msごとに設定すると、 とDoEventsを呼び出して同様の問題を解決したようです。

private void timer1_Tick(object sender, EventArgs e) 
    { 
     //BringToFront(); 
     Application.DoEvents(); 
    } 

・ホープこれはあなたは、その「リージョン」プロパティを設定することで、簡単に不規則な形のフォームを作成することができます

0

に役立ちます。ここでは例です:本当に透明コントロールのよう

Irregularly shaped form

、ここではステップバイステップの手順での優れたリソースです:それはしばらくの間されている

Transparent Controls

3

が、私はあなたが持っていると思いますフォームをAllow Tranparenciesに設定してください。

this.AllowTransparency = true; 
or 
YourForm.AllowTransparency = true; 

0

、友好的、商業ではないしたら、

overImage.Parent = backImage; 
overImage.BackColor = Color.Transparent; 
overImage.Location = thePointRelativeToTheBackImage; 

ここでoverImageとbackImageはpng(透明な背景)を持つPictureBoxです。

1

私は同じ問題を持っていたが、私はそう、私はその下のすべてを見ることができました透明してきたはずですただパネルを持っていました。

プロパティをDoubleBufferedで問題は、それがに設定する必要がありました。もう

this.DoubleBuffered = false;

はありません黒さ。

関連する問題