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 :

Obtenir le buffer de dessin d'un control parent


Sujet :

VB.NET

  1. #1
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut Obtenir le buffer de dessin d'un control parent
    Bonjour.

    J'ai de nombreux controls transparents pour lesquels je substitue le OnPaintBackGround par un InvokePaintBackground du parent dans le OnPaint du control.

    Tout cela marche trés bien mais le resize du parent rend visible la manipulation (j'ai pourtant optimiser un maximum le code, je pense) dans le cas d'une form avec un gradient en fond qui contient des panels perso "transparents" --> on voit trés bien que les panels traînent un peu sur le dessin du background.

    Pour optimiser tout cela, j'avais dans l'idée de mettre à disposition par les parents une bitmap "BackGroundBuffer" qui contient l'image utilisée pour le BackGround que j'utiliserai dans les controls enfants lors du OnPaintBackGround au lieu de faire un invoke.

    Cela implique donc que j'implémente ce "BackGroundBuffer" dans tout mes controls contenair.

    La question : existe-il une méthode/function pour récupérer le buffer utilisé par une control pour peindre son background (je pense ici buffer et pas BackGroundImage bien sûr) ?

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    malheureusement je crois que le framework ne travaille pas avec des buffer mais directement l'objet graphics

    enfin si tu overrides onpaintbackground, que tu appelles mybase, pevent.graphics est dessiné avec le contenu
    tu dois meme pouvoir appeler directement mybase en créant un pevent et en faisant en sorte que pevent.graphics soit un buffer.graphics

    pas sur que ca répondesà ta question ....
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Citation Envoyé par sperot51 Voir le message
    malheureusement je crois que le framework ne
    travaille pas avec des buffer mais directement l'objet graphics
    J'avais un doute du fait du bit de style OptimizeDoubleBuffer et d'un truc que j'avais lu sur la réduction du flickering par son utilisation dans le control contenair (mais j'ai pas bien vu de différence en fait...).

    Citation Envoyé par sperot51 Voir le message
    enfin si tu overrides onpaintbackground, que tu appelles mybase, pevent.graphics est dessiné avec le contenu
    tu dois meme pouvoir appeler directement mybase en créant un pevent et en faisant en sorte que pevent.graphics soit un buffer.graphics
    Je dessine tout dans le OnPaint et via effectivement un buffer.graphics. L'appel à Mybase.OnPaintBackGround ne fera effectivement pas ce que je veux car je laisse dans ce cas la main au Framework et donc adieu transparence.

    Je pense que je vais donc mettre à disposition dans mes control contenair le buffer utilisé pour le BackGround ou une méthode "OnPaintCustomBackGround" qui dessinera le fond du control parent dans un buffer et un bounds en paramétre...

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par olsimare Voir le message
    Je dessine tout dans le OnPaint et via effectivement un buffer.graphics. L'appel à Mybase.OnPaintBackGround ne fera effectivement pas ce que je veux car je laisse dans ce cas la main au Framework et donc adieu transparence.

    la méthode OnPaintBackGround de la classe control gère la transparence (en regardant ce qu'il y a en dessous et en le peignant sur le graphics)
    suite à ca onpaint de la classe control dessine le control en lui meme, le fond ayant déssiné (couleur unie ou ce qu'il y a en dessous si backcolor = transparent)
    donc si tu appelle OnPaintBackGround en fournissant ton buffer.graphics ca devrait aller
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Sperot, C'est effectivement une solution plus élégante que le invoke à laquelle je n'avais pas pensé .

    Donc pour ceux que ça intéressent :
    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
    42
     
    Public Class LabelTest
        Inherits Label
     
        Public Sub New()
            SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
            SetStyle(ControlStyles.AllPaintingInWmPaint, True)
            SetStyle(ControlStyles.UserPaint, True)
        End Sub
     
        Public Overrides Property BackColor() As System.Drawing.Color
            Get
                Return Color.Transparent
            End Get
            Set(ByVal value As System.Drawing.Color)
                MyBase.BackColor = Color.Transparent
            End Set
        End Property
     
        Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
     
            Dim ibufferImage As Bitmap = New Bitmap(Me.Bounds.Width, Me.Bounds.Height)
            Dim gd As Graphics = Graphics.FromImage(ibufferImage)
            gd.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
            gd.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit '.AntiAlias '.ClearTypeGridFit '.AntiAlias
            '
            ' Background du parent
            '
            MyBase.OnPaintBackground(New PaintEventArgs(gd, Me.Bounds))
     
            gd.DrawString(Text, Font, Brushes.White, New Point(0, 0))
     
            e.Graphics.DrawImage(ibufferImage, 0, 0)
     
            gd.Dispose()
     
        End Sub
     
        Protected Overrides Sub OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs)
            'MyBase.OnPaintBackground(pevent)
        End Sub
    End Class
    Par contre, c'est toujours trés moyen lors du resize (mais mieux quand même).

    Je sens bien le truc insoluble ...

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    essaye avec OptimizedDoubleBuffer à false
    il me semble que quand on gère ca soi meme c'est mieux

    sinon y a un setstyle sur le resize, change le aussi de valeur
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Non, ça ne change rien ...

    Mais j'ai refais un tour sur le code de la form de base et c'est pas super optimisé... donc je vais me pencher la dessus.

    Merci Sperot.

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  8. #8
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 682
    Points : 1 952
    Points
    1 952
    Par défaut
    Je reviens sur ton new code pour la gestion transparent olsi, mais dans l'etat il ne peux etre ok pour moi, car il faut que j'utilise textrenderer (cf ancien post) et d'apres les erreurs il n'est pas utilisable avec graphics ...
    Que les neurones soient avec toi, jeune padawan.
    Ne pas oublier, qu'un métier, développer être.
    Effectuer des recherches et lire les tutos, avant de poster, tu dois.
    Aucune question technique, faites par MP, tu ne dois.

  9. #9
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Hello Dany.

    Et bien avec un TextRenderer.DrawText(g,...) je vois pas le soucis.

    J'ai maintenant opté pour un drawstring pour pouvoir utiliser un brush (malgré le tassage bizarre sur le rendu du texte vu dans un vieux post ... mais que je ne constate pas avec un brush).

    A noter, que je n'ai toujours pas trouver la solution miracle à mon probléme initial de flickering ... mais bon je perfectionne trop je pense.

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  10. #10
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 682
    Points : 1 952
    Points
    1 952
    Par défaut
    Citation Envoyé par olsimare Voir le message
    Et bien avec un TextRenderer.DrawText(g,...) je vois pas le soucis.
    Vas y continue dans la paranthese ... et en reprenant ton new code !!!
    Je suis aussi en quete de gain de vitesse d'affichage de form assez complexe et surtout fourni.
    (encore 10x pire avec un fond en avec une image !!!)
    Que les neurones soient avec toi, jeune padawan.
    Ne pas oublier, qu'un métier, développer être.
    Effectuer des recherches et lire les tutos, avant de poster, tu dois.
    Aucune question technique, faites par MP, tu ne dois.

  11. #11
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Citation Envoyé par Danyel Voir le message
    Vas y continue dans la paranthese ... et en reprenant ton new code !!!
    Eh bien tu deviens directif !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TextRenderer.DrawText(g, strText, Me.Font, _
            CLFWAddTextDrawing.Point(Me.TextAlign, Me.Bounds, strText, Me.Font), _
            Me.ForeColor)
    PS : le CLFWAddTextDrawing.Point est le même genre de truc que ce que tu mettais pour déterminer le point d'insertion.

    Je vois pas le soucis.

    A la rigueur réouvre ton post car on mélange un peu là.

    Citation Envoyé par Danyel Voir le message
    Je suis aussi en quete de gain de vitesse d'affichage de form assez complexe et surtout fourni.
    (encore 10x pire avec un fond en avec une image !!!)
    Il y a pas mal de post la dessus dont un interessant avec une réponse de Sperot51 qui utilise un timer avant le show :
    http://www.developpez.net/forums/sho...ighlight=timer

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  12. #12
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 682
    Points : 1 952
    Points
    1 952
    Par défaut
    Merci olsi.
    Non non je ne suis pas directif (lolololololololol)
    Je vais tester tout cela et allez aussi voir le post de sperot (que je ne connais pas dirait-on)

    Sinon, le rendu du texte de ton new code est peu correct et vraiment bizarre des qu'on depasse un certain nombre de caracteres.
    (je peux t'envoyer un screen si tu le desires)
    Que les neurones soient avec toi, jeune padawan.
    Ne pas oublier, qu'un métier, développer être.
    Effectuer des recherches et lire les tutos, avant de poster, tu dois.
    Aucune question technique, faites par MP, tu ne dois.

  13. #13
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Re.

    Citation Envoyé par Danyel Voir le message
    Sinon, le rendu du texte de ton new code est peu correct et vraiment bizarre des qu'on depasse un certain nombre de caracteres.
    (je peux t'envoyer un screen si tu le desires)
    Mets le tout dans ton post initial avec le code, comme ça on aura différent avis.

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

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

Discussions similaires

  1. [AC-2003] obtenir l'element racine dans un Treeview Control
    Par DonKnacki dans le forum IHM
    Réponses: 5
    Dernier message: 07/03/2015, 16h43
  2. Réponses: 0
    Dernier message: 10/11/2010, 09h40
  3. Dessin complexe dans controle personnalise Forms C#
    Par saragaglia dans le forum Débuter
    Réponses: 3
    Dernier message: 09/07/2008, 10h27
  4. Réponses: 6
    Dernier message: 02/06/2006, 14h47
  5. Problème avec control parent de type TDrawGrid
    Par slylafone dans le forum C++Builder
    Réponses: 2
    Dernier message: 09/11/2005, 17h32

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