2012-07-10 4 views
14

Mit zwei überlappenden PictureBox controls, versuche ich, die transparenten Bereiche der Bildbox die Kontrollen unten (in der Z-Reihenfolge) sichtbar zu machen.Können zwei überlappende PictureBox-Steuerelemente mit transparenten Bildern verwendet werden?

Auch nach trying what Microsoft suggests kann ich nicht das gewünschte Ergebnis erhalten.

Dies ist, was ich derzeit haben:

enter image description here

Und das ist, was ich will:

enter image description here

Also meine Frage ist:

Jede Art und Weise zu erreiche mein gewünschtes Ergebnis mit zwei PictureBox Kontrollen (oder auf andere Weise), die sich überlappen und die transparenten Bereiche durchscheinen lassen?

Update:

Eigentlich löste ich es von this answer auf die SO Frage "Transparent images with C# WinForms" verwenden.

+0

Versuchen Sie, was ist die ext der Bilder? – sikas

+0

@sikas Das Schild ist eine PNG-Datei mit Alpha-Kanal. Warum sollte das wichtig sein? –

+1

WinForms unterstützt dies standardmäßig nicht. Sie müssen ein paar sehr interessante Drawing-Hacks machen, um es zum Laufen zu bringen. WPF tut dies jedoch ohne Probleme. –

Antwort

2

Soweit ich weiß, hängt die Transparenz eines Steuerelements von seiner übergeordneten Kontrolle ab (wie in dem von Ihnen angegebenen Link angegeben), was bedeutet, dass Sie, um den gewünschten Effekt zu haben, einen haben müssen Bildbox verschachtelt in eine andere Bildbox, was unmöglich ist, da eine Bildbox kein Container ist.

Sie können jedoch ein benutzerdefiniertes Containersteuerelement anstelle eines Bildfelds für das übergeordnete Bild verwenden. Die einfachste Steuerung wäre ein Panel. Stellen Sie einfach das Hintergrundbild des Steuerelements ein und legen Sie das zweite Bildfeld hinein.

Eine andere Lösung wäre, ein einzelnes Bildfeld zu verwenden und das Rendern manuell zu verwalten.

Dies ist bei weitem die beste Lösung, da die pseudo-simulierte Transparenz der anderen Methode leise ineffizient ist.

16

dieses

private void Form1_Load(object sender, EventArgs e) 
{ 
    // Transparent background... 
    pictureBoxOverlay.BackColor = Color.Transparent; 

    // Change parent for overlay PictureBox... 
    pictureBoxOverlay.Parent = pictureBoxMain; 

// Change overlay PictureBox position in new parent... 
// pictureBoxOverlay.Location = new Point(0, 0); 
} 

Ergebnis

enter image description here

llink

+0

Danke, das funktioniert, wenn die Overlay Picture Box nicht von der Bildbox abgeschnitten wird. Ich brauche sie nur teilweise zu überlappen. –