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

Windows Forms Discussion :

Effacement des Graphics d'un Form ?


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 64
    Points : 50
    Points
    50
    Par défaut Effacement des Graphics d'un Form ?
    Bonjour,

    Je fais appel à une fonction de création de Controls dynamique pour mon WindowsForm.
    Cette fonction se situe dans un Suspend Layout tel que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Form1.SuspendLayout()
    CreerControles()
    Form1.ResumeLayout()
    Cette fonction va instancier des Label, des Textbox ou dessiner des rectangles selon le cas.

    Je définie au début de la fonction le "Graphics" de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim formGraphics As System.Drawing.Graphics
    formGraphics = Form1.CreateGraphics()
    Je me demande pourquoi lorsque mon Form s'affiche quand il a fini les traitements, je vois l'affichage des dessins, mais ils s'effacent je ne sais pas pourquoi ... car normalement avec SuspendLayout je ne devrait pas voir ce clignotement ?
    Et aussi pour quelle raison les controles sont conservés et pas les dessins ?

    Merci d'avance pour vos réponses !

    Ps : les controles sont crées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim lbl As LAbel
    'lbl = ...
    From1.Controls.Add(lbl)

  2. #2
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 64
    Points : 50
    Points
    50
    Par défaut
    Je pensais que le problème venait de mon Graphics et d'un problème de persistance de l'objet à la fin de la fonction qui crée les controls,

    Du coup j'ai créer un attribut dans Form1 :
    Public formGraphics As Graphics

    et dans ma fonction je l'initialise de la sorte :
    Form1.formGraphics = Form1.CreateGraphics()

    mais ce n'est pas ca du tout...

    Quelqu'un a une idée ?

    Merci d'avance !

  3. #3
    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
    suspendlayout sert à de pas redessiner pendant les changement de location et les changement de size c'est tout, donc c'est pas grand chose

    pour le graphics, à chaque evenement paint sur un control, celui ci se redéssine (fond, éventuellement texte, image etc...) selon les propriétés qu'il a

    si tu fais du draw sur un graphics, il faut donc le faire dans l'évènement paint de ce control, pour qu'à chaque appel de paint ton dessin se redessine (form est un control)

    paint est appelé assez souvent, genre quand une fenetre passe au dessus du control, quand le controle change de taille etc...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 64
    Points : 50
    Points
    50
    Par défaut
    Ce n'est vraiment pas possible de faire autrement ?

    Je trouve ça plutot idiot de devoir faire mes dessins dans l'évènement paint de Form1 sachant que la fonction creercontroles se trouve dans une autre classe ...

    J'ai vu qu'on pouvais surcharger la méthode OnPaint et que celle-ci fait appel à Paint, mais je ne vois pas en quoi cela nous serait utile ...

    Je prend un exemple tout simple, supposons que ma fonction creercontroles va itérer 50 fois et ajouter soit un label soit un rectangle à Form1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For i = 0 To 49
       type = calculType(type)
       if type = 0
          'ajoute un label a form1
       Else
          'dessine un rectangle a form1
       End If
    Next i
    Je ne vois pas en quoi placer les dessins dans Form1_Paint vont arranger mes problèmes car à chaque ajout de composant de form1 il va redessiner tout ce qu'il est déja censé avoir été dessiné ?

  5. #5
    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
    bienvenue dans la logique microsoft du windows form et du paint
    quand je dis que cet evenement est appelé souvent, c'est meme trop souvent, ca arrete pas des fois (et 2x plus sur xp que sur vista)

    l'affichage de tous les controles se passent comme ca
    un bouton c'est des drawimage, des drawstring et des drawrectangle

    (chaque controle possède un handle de fenetre de windows même )


    donc soit tu passes en wpf sur vs2008
    soit tu enregistres une image de ton dessin sur le form que tu la mets dans la propriété backgroundimage
    soit dans ta boucle tu remplies une collection de tout ce que tu dois dessiner et dans l'overrides de onpaint tu redessines tout ce qu'il y a à dessiner dans ta collection
    soit à la place de tes rectangles tu créé un control spécial qui fait un drawrectangle sur le onpaint


    sinon la sub onpaint fait le raiseevent paint (tous les on quelque chose raise le quelque chose)
    donc sur un override il faut laisser le mybase.onmachin pour que le raiseevent soit bien fait des fois que tu en ais besoin quelque part
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 64
    Points : 50
    Points
    50
    Par défaut
    Merci de ton aide sperot51,

    je me suis inspiré de cette phrase : " tu enregistres une image de ton dessin sur le form que tu la mets dans la propriété backgroundimage "

    J'ai réussi à faire ce que je voulais en l'adaptant un peu... Je vous met le code de l'exemple que j'ai généré à titre d'information

    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 Form1
     
        Private img As Bitmap
        Private graph As Graphics
     
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            img = New Bitmap(Me.Width, Me.Height)
            graph = Graphics.FromImage(img)
     
            Me.BackgroundImage = img
        End Sub
     
        'draw ellipse
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim i As Integer
            Me.SuspendLayout()
            For i = 10 To Me.Width
                graph.DrawEllipse(Pens.Red, New RectangleF(i, i, i, i))
                i += 10
            Next
            Me.ResumeLayout()
            Me.Refresh()
        End Sub
     
        'clear
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Me.SuspendLayout()
            graph.Clear(Color.Transparent)
            Me.ResumeLayout()
            Me.Refresh()
        End Sub
     
    ' resize
        Private Sub Form1_ResizeEnd(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ResizeEnd
            img.Dispose()
            img = New Bitmap(Me.Width, Me.Height)
            graph = Graphics.FromImage(img)
     
            Me.BackgroundImage = img
            Button2_Click(sender, e)
        End Sub
    End Class

  7. #7
    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
    SuspendLayout et ResumeLayout ne servent à rien dans ton cas
    ces fonctions permettent juste d'éviter le redessin pendant les changement de taille et d'emplacement (size et location)

    elles sont utilisées dans initializecomponent vu qu'il y a le set de ses propriétés pour plusieurs controles
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 64
    Points : 50
    Points
    50
    Par défaut
    ok c'est noté, merci de la précision

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

Discussions similaires

  1. Effacer des formes automatiques
    Par Del4king dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/07/2007, 18h08
  2. Récupération des champs d'un form dans un autre
    Par Crazyblinkgirl dans le forum ASP
    Réponses: 10
    Dernier message: 22/06/2004, 10h31
  3. transmettre des infos entre 2 forms ?
    Par mikyfpc dans le forum C++Builder
    Réponses: 7
    Dernier message: 01/02/2004, 11h03
  4. [VB6] Comment boucler sur des controls d'un form ?
    Par lankviller dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 27/01/2003, 16h29
  5. Comment effacer des Items d'un TListView ?
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 11/11/2002, 10h19

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