IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Problème de transparence de PictureBox avec vb.net


Sujet :

VB.NET

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Par défaut Problème de transparence de PictureBox avec vb.net
    Bonjour,

    Je voudrais afficher une image qui contiens des zones transparents (png ou gif) dans une pictureBox en vb.net.
    Mais le probleme c'est que je n'arrive pas à rendre le fond de la picturebox transparent. J'ai tester plusieurs codes ou astuces trouver ici et la sur le net mais rien ne marche.

    Je sais que la question à déjà était posée pour le vb6 et antérieur mais je ne trouve rien pour le vb.net .

    Si quelqu'un peut m'aider je l'en remercie d'avance.

  2. #2
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ZePictureBox.BackColor = Color.Transparent;
    ?

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Par défaut
    j'ai déjà esseyer ça ne marche pas...

    la couleur Color.Transparent existe belle et bien mais ça donne du blanc au final.

    merci quand même, une autre idée peut étre?

  4. #4
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    ça met comme couleur de fond celle du composant parent (ou à défaut, celle de la form).
    Mais dit moi, que veux tu faire exactement ? superposer des pictureBox ou quoi ?

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Par défaut
    ça met comme couleur de fond celle du composant parent
    merci ça explique pourquoi j'ai un blanc.

    Effectivement je cherche a superposer plusieurs pictureBox.
    Enfin pas forcement des PictureBox je veux superposer plusieurs images avec gestion de la transparent et possiblité de gere et modifier la position de l'image.

    J'espère étre assez claire.

  6. #6
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Si tu veux faire tout ça toi même il faudra tricher :
    Dans ton projet, tu rajoutes cette classe.
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
        public class TrickedPictureBox : PictureBox
        {
            public TrickedPictureBox()
            {
                OldParent = null;
            }
     
            protected virtual Control OldParent { get; set; }
     
            protected override void OnPaint(PaintEventArgs pe)
            {
                if (Parent != OldParent)
                {
                    OldParent = Parent;
                    try
                    {
                        Parent.Paint -= new PaintEventHandler(OldParent_Paint);
                    }
                    catch { }
     
                    if (OldParent != null)
                    {
                        try
                        {
                            OldParent.Paint += new PaintEventHandler(OldParent_Paint);
                            OldParent.Invalidate();
                        }
                        catch { }
                    }
                }
                if (BackColor == Color.Transparent)
                {
                    /* nothing */
                }
                else
                {
                    base.OnPaint(pe);
                }
            }
     
            void OldParent_Paint(object sender, PaintEventArgs e)
            {
                if (Image != null)
                {
                    e.Graphics.DrawImage(Image, new Point(Left, Top));
                }
            }
        }
    Et tu remplaces tes PictureBox par mes TrickedPictureBox, et dit moi si ça marche.

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Par défaut
    merci de tes réponses rapides smyley

    J'ai testé ta classe mais ça me donne le même résultat.

    Par contre je l'ai convertie en VB.net (je sais pas si ça peux venir de la), se qui me donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     
    Public Class TrickedPictureBox
        Inherits PictureBox
     
        Dim OldParent As Control
     
        Public Sub New()
            OldParent = Nothing
        End Sub
     
        Protected Overloads Overrides Sub OnPaint(ByVal pe As PaintEventArgs)
            If Not Parent.Equals(OldParent) Then
                OldParent = Parent
                Try
                    RemoveHandler Parent.Paint, AddressOf OldParent_Paint
                Catch
                End Try
     
                If OldParent IsNot Nothing Then
                    Try
                        AddHandler OldParent.Paint, AddressOf OldParent_Paint
                        OldParent.Invalidate()
                    Catch
                    End Try
                End If
            End If
            If BackColor = Color.Transparent Then
                ' nothing
     
            Else
                MyBase.OnPaint(pe)
            End If
        End Sub
     
        Private Sub OldParent_Paint(ByVal sender As Object, ByVal e As PaintEventArgs)
            If Image IsNot Nothing Then
                e.Graphics.DrawImage(Image, New Point(Left, Top))
            End If
        End Sub
    End Class

    J'ai fait ça car étant novice en .net je n'ai pas réussit (malgré deux bonnes heures de recherche) à utiliser une classe C# dans un projet VB.

    -Donc ça vient peu être d'une erreur lors de la conversion (dans ce cas tu a peu être une idée de correction)
    -Ou alors c'est tout simplement pas faisable en VB (dans ce cas si quelqu'un pouvais m'orienter vers un tuto qui explique comment utiliser une class C# dans un projet VB)

  8. #8
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par lordpatate Voir le message
    J'ai testé ta classe mais ça me donne le même résultat.
    ça c'est étrange, je l'ai testée avant de te la donner et ça marchait.
    Tu es sur d'avoir bien définit BackColor à Transparent ?
    Essayes dans un projet bidon, de créer une assembly à partir de la classe, la rajouter dans la boîte d'outils de VS et supperposer plusieurs images png (donc avec de la transparence) sur une form. Le code VB.NET semble correct.

  9. #9
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    je vous suis un peu depuis le début mais je comprends pas trop le soucis
    à savoir que la transparence dans .net, c'est un controle qui demande à son parent de se repeindre sur lui avant de faire son propre rendu dessus

    donc si 2 picturebox sont sur une form avec un fond blanc, et que les picturebox se chevauchent un peu, la transparence ne fonctionnera pas, car picturebox1 et 2 demanderont à form de se repeindre sur eux et se peindront ensuite
    mais picturebox1 et 2 ne se peindront pas l'un sur l'autre, n'ayant aucun lien de type parent enfant

    après, il est possible de créer un controle intelligent qui s'occupe de faire ca bien ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Bah justement on peut tricher en peignant directement l'image sur le contrôle parent, ce qui résout la transparence mais à ce niveau (s'il y a encore d'autres panels transparents, ça va pas ...).

  11. #11
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    on peut tricher
    On est bien obligé de tricher et, encore les conditions pour que l'on puisse maintenir un effet de transparence sont assez restrictives.
    Il me semble qu'il est quasi impossible de conserver l'effet en Winforms, il faut plus ou moins redessiner ou recréer l'élément transparent chaque fois qu'un élément situé en-dessous se retrace!

  12. #12
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Par défaut
    Citation Envoyé par Graffito
    On est bien obligé de tricher et, encore les conditions pour que l'on puisse maintenir un effet de transparence sont assez restrictives.
    Il me semble qu'il est quasi impossible de conserver l'effet en Winforms, il faut plus pu moins redessiner ou recréer l'élément transparent chaque fois qu'un élément situé en-dessous se retrace!
    dommage c'est pile ce que je voudrais faire...

    Smyley j'ai créé une un .dll à partie de ton code et je l'ai inclue dans ma boite a outils mais ça change toujours rien. Ça vient peut être du fait que mon objet et en déplacement content.

    je vais expliquer clairement ce que je veux:
    ------------

    La PictureBox rouge passe par dessus la PictureBox Bleu pendant son déplacement pixel par pixel.


    Voila avec ça je pense que tout le monde aura compris.

  13. #13
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Les WinForms ne sont pas fait pour faire des animations, quelque soit le type d'animation (sauf les animations gifs). Même si tu y arrives (en dehors des gifs peut être) tes perfs seront désastreuses ...

  14. #14
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Par défaut
    Si j'ai bien compris VB n'est pas adapter à ce que je veux faire...
    C'est pas grave, je ferais ça avec une autre techno.

    Merci beaucoup pour les informations.

  15. #15
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Si tu as le choix de la techno, essayes WPF. ça donne une force mais d'une force ... !

  16. #16
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    en winforms on peut quand meme faire des trucs dans le genre avec des bufferedgraphics, mais autant passer sur wpf si c'est possible, c'est plus prévu pour
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  17. #17
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Par défaut
    C'est parfait car je ne suis pas limité sur la techno.

    Je ne connaissais pas WPF mais je commence à regarder quelques tutos et ça m'a l'aire pas mal.
    Sinon je pourrais aussi passer en java.


    En tout cas merci pour vos conseilles.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de sauvegarde des données avec ADO.net
    Par xave4552 dans le forum Framework .NET
    Réponses: 2
    Dernier message: 20/02/2013, 04h26
  2. Problème d'ajout des données avec ado.net
    Par ahmedbj dans le forum ADO.NET
    Réponses: 10
    Dernier message: 14/03/2012, 13h36
  3. [Débutant] Problème executer un fichier .bat avec ASP .net (script en vb)
    Par MidoKorg dans le forum ASP.NET
    Réponses: 1
    Dernier message: 30/09/2011, 17h45
  4. Problème connexion sql server 2005 avec asp.net en C#
    Par PKO06 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 29/05/2007, 18h46
  5. [VB.NET] Problème de connexion à la base avec VB.net
    Par Bqda dans le forum Windows Forms
    Réponses: 13
    Dernier message: 02/04/2006, 13h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo