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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 183
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 183
    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.

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    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 Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 183
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 183
    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.

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    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 Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 183
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 183
    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.

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    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

+ 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