2009-08-05 4 views
4

Je suis affiché dans un panneau PictureBox chevauché, car chaque PictureBox est utilisé comme couche . La première fois qu'un PictureBox est défini et ajouté au panneau, sa couleur de fond est transparente, et ses images sont vides.Problème de transparence par PictureBox superposé à C#

Le problème est que la couche inférieure ne peut pas être vue, l'image transparente montre la masse du panneau . Excepté est que l'image du bas PictureBox est vue.

Je l'ai essayé avec d'autres contrôles comme l'étiquette. Le problème ne pouvait être résolu :(

Merci.

+0

Ceci est un peu difficile à suivre. Je pense que si vous l'expliquez différemment, vous obtiendrez peut-être des réponses. –

Répondre

11

En effet, si je me souviens bien, définir une couleur de fond de transparent (sa valeur réelle est nulle, non?) N'est pas vraiment transparent Ce que fait Windows est de regarder la couleur d'arrière-plan du contrôle du conteneur parent et de définir la couleur de fond des contrôles à cela

Vous pouvez voir ceci se produire surtout avec des panneaux.Sans contenu, les panneaux réglés sur Transparent devraient vous laisser voir derrière eux, Si vous placez un panneau au-dessus d'un groupe de commandes de zone de texte, par exemple, et réglez le panneau sur Transparent, vous ne pourrez pas e les zones de texte derrière elle. Au lieu de cela, pour obtenir une transparence réelle, vous devez surcharger OnPaintBackground pour le contrôle en question et, essentiellement, ne rien faire (N'appelez pas le base.OnPainBackground non plus!) ... Il y a plus que ça, probablement, mais voici un exemple d'un contrôle TransparentPanel de travail que nous utilisons ici:

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 
    } 
} 

nous avons utilisé cette classe pour créer avec succès des panneaux transparents vraiment dans le passé Windows Forms applications. Nous l'avons utilisé comme un hack pour corriger le problème du "menu contextuel du clic droit sur le bouton".

+0

Comment puis-je appeler cela, pour créer un panneau transparent dans Winforms – user335160

+0

Vous pouvez mettre la classe ci-dessus dans un projet de bibliothèque de contrôle que vous référencez (c'est ce que nous faisons) ou vous pouvez également l'avoir directement dans votre projet. fichier. Il n'apparaîtra pas dans votre boîte à outils si vous ne l'ajoutez pas.Cependant, vous pouvez faire glisser un panneau normal dans votre zone de conception et ouvrir le fichier designer.cs et modifier manuellement l'objet sur votre TransparentPanel spécial. –

+1

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

5

Ceci est mon avis sur la question:

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; 
     } 
    } 
} 

Vous devriez ajouter un peu plus logique pour le positionnement de l'image que vous le souhaitez et de modifier la méthode OnPaint en conséquence.

0

Vous devriez faire

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

de sorte que votre image ne sera pas streched

2

Je suis en mesure de le faire en VB. Il y a quelques astuces cependant. Tout d'abord, vous devez ajouter les boîtes d'image les uns aux autres. Deuxièmement, les images dans les boîtes d'image doivent être des images PNG.

Pour cette application, j'ai dû afficher 3 couches différentes au-dessus d'un calque d'arrière-plan et les activer et désactiver avec des cases à cocher. Si cela ne fonctionne pas, jouez avec la manière dont vous sauvegardez vos fichiers PNG, c'est un peu difficile à faire.

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

Hot putain, ça marche! Mais attention, PictureBoxSizeMode.Zoom ** ne fonctionne pas ** et vous devrez peut-être définir manuellement les dimensions des PictureBoxes enfants si l'image de base est autorisée à évoluer vers un conteneur parent. –