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 :

Bug : Utilisation de la classe Graphics et génération d'ellipse


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Bug : Utilisation de la classe Graphics et génération d'ellipse
    Bonjour,

    (Je vous explique mon problème et je vous met en exemple le code ma méthode ainsi que le résultat que j'obtient.)

    J'utilise un objet Graphics pour tracer une ellipse qui ce trouve dans un contrôle panel parent qui lui même se trouve dans un contrôle de type TableLayoutPanel ayant seulement une colonne (donc une seule cellule)

    Mon résultat actuelle est que lors de la première exécution du ma méthode aucune ellipse ne semble ce générer en tout cas visuellement mais lors de la seconde exécution on peut voir qu'une ellipse est bien générer comme on peut le voir dans l'image ci-dessous.

    Mon code semble bon car je m'explique lors de mes différents test précédent tout était fonctionnelle mais par je ne sais quel sorcellerie et modification j'en suis arriver à ce résultat sans arriver à mettre le nez sur le problème actuelle.

    Si une personne ayant déjà utiliser la classe Graphics peut m'aiguiller sur son utilisation permettant de savoir si oui ou non mon utilisation de cette classe est correct ou des astuces me permettant de le débugger je suis preneur car actuellement je ne trouve vraiment pas le problème. Si vous avez besoin du fichier complet je peut aussi le fournir.


    J'ai aussi un autre bug qui doit surement venir de l'utilisation d'un objet Graphics je doit oublier une étape, lorsque mon ellipse est tracer dans le contrôle Si je viens à déplacer mon Form (Ma fenêtre) hors de l'écran ou bien simplement la réduire, l'ellipse n'est plus visible.

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    Private Sub DrawLight(ByVal iStatus As Int32)
            Dim i As Int32
            Dim bFlag As Boolean
            Dim ctrl As Control
            Dim grfGraphics As Graphics
            Dim bshBrush As New SolidBrush(Color.Gray)
            Dim penDrawingPen As New Pen(Color.Black)
            Dim SizePen As Single = 3
     
            penDrawingPen.Width = SizePen
     
     
            Select Case iStatus
                'Etat de marche
                Case 1
                    bshBrush.Color = Color.Green
                'Etat : arrêt technique
                Case 2
                    bshBrush.Color = Color.Red
                'Etat : arrêt fonctionnel
                Case 3
                    bshBrush.Color = Color.Orange
                'Etat : arrêt à requalifier
                Case 4
                    bshBrush.Color = Color.Purple
                'Etat : arrêt nettoyage/changement de format
                Case 5
                    bshBrush.Color = Color.Blue
            End Select
     
            i = 0
            bFlag = False
            While i < Controls.Count And bFlag = False
                ctrl = Controls.Item(i)
                If ctrl.Name = "pnlLight" Then
                    grfGraphics = ctrl.CreateGraphics()
     
     
                    If m_bDisplayInfos Then
                        If m_bLabelAlignment Then
                            If ctrl.Width > ctrl.Height Then
                                grfGraphics.DrawEllipse(penDrawingPen, ctrl.Location.X, ctrl.Location.Y, CInt((ctrl.Width - 5) / 2), CInt((ctrl.Width - 5) / 2))
                                grfGraphics.FillEllipse(bshBrush, ctrl.Location.X, ctrl.Location.Y, CInt((ctrl.Width - 5) / 2), CInt((ctrl.Width - 5) / 2))
                            Else
                                grfGraphics.DrawEllipse(penDrawingPen, ctrl.Location.X, ctrl.Location.Y, CInt((ctrl.Height - 5) / 2), CInt((ctrl.Height - 5) / 2))
                                grfGraphics.FillEllipse(bshBrush, ctrl.Location.X, ctrl.Location.Y, CInt((ctrl.Height - 5) / 2), CInt((ctrl.Height - 5) / 2))
                            End If
                        Else
     
                            If ctrl.Width > ctrl.Height Then
                                grfGraphics.DrawEllipse(penDrawingPen, ctrl.Location.X, CInt(ctrl.Height / 10), CInt((ctrl.Width - 5) / 2), CInt((ctrl.Width - 5) / 2))
                                grfGraphics.FillEllipse(bshBrush, ctrl.Location.X, CInt(ctrl.Height / 10), CInt((ctrl.Width - 5) / 2), CInt((ctrl.Width - 5) / 2))
                            Else
                                grfGraphics.DrawEllipse(penDrawingPen, ctrl.Location.X, CInt(ctrl.Height / 10), CInt((ctrl.Height - 5) / 2), CInt((ctrl.Height - 5) / 2))
                                grfGraphics.FillEllipse(bshBrush, ctrl.Location.X, CInt(ctrl.Height / 10), CInt((ctrl.Height - 5) / 2), CInt((ctrl.Height - 5) / 2))
                            End If
                        End If
                    Else
                        If ctrl.Width > ctrl.Height Then
                            grfGraphics.DrawEllipse(penDrawingPen, ctrl.Location.X, CInt(ctrl.Height / 10), ctrl.Width - 15, ctrl.Width - 15)
                            grfGraphics.FillEllipse(bshBrush, ctrl.Location.X, CInt(ctrl.Height / 10), ctrl.Width - 15, ctrl.Width - 15)
                        Else
                            grfGraphics.DrawEllipse(penDrawingPen, ctrl.Location.X, CInt(ctrl.Height / 10), ctrl.Height - 15, ctrl.Height - 15)
                            grfGraphics.FillEllipse(bshBrush, ctrl.Location.X, CInt(ctrl.Height / 10), ctrl.Height - 15, ctrl.Height - 15)
                        End If
                    End If
                    penDrawingPen.Dispose()
                    grfGraphics.Dispose()
     
                    bFlag = True
                End If
                i = i + 1
            End While
        End Sub
    Nom : Test1.PNG
Affichages : 90
Taille : 1,6 Ko

  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
    il faut comprendre le mécanisme d'affichage des windows forms
    à savoir, windows demande dans certains cas au form de se redessiner (déplacement de fenetre ...)
    et d'autre part form hérite de control, tout controle qui se dessine peut dans certains cas demander à ses enfants de redessiner
    (et en plus des fois c'est dans l'autre sens avec la "transparence")

    ceci est fait sur un évènement des controles, Paint

    ainsi tout ce que tu dessines via CreateGraphics est fait en dehors de ce cycle, donc au prochain Paint appelé, le controle est effacé et il se redessine (mais pas ce que tu avais mis dessus)

    il faut donc se passer de creategraphics (or ajout d'un morceau de dessin pour gagner un peu de temps) et dessiner dans l'event Paint

    à toi d'avoir les variables nécessaires d'accessibles à ce moment là

    NB : pour forcer le redessin il faut appeler uncontrol.invalidate, l'event paint sera alors rappelé
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    D'accord, oui je comprend bien le principe est le pourquoi de mon soucis du coup, je pense faire du coup autrement pour réaliser ce que je veut faire utiliser plutôt une image plutôt que redessiner une ellipse comme je faisais.
    mais merci comme même ça me permet de mieux comprendre le fonctionnement propre aux windows form que je connaissais pas encore

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

Discussions similaires

  1. [C# .Net] Utilisation de la classe Graphics
    Par superjaja dans le forum ASP.NET
    Réponses: 2
    Dernier message: 15/01/2007, 16h07
  2. Utilisation de la classe List de STL avec wxWidgets
    Par aoyou dans le forum wxWidgets
    Réponses: 7
    Dernier message: 10/03/2005, 17h41
  3. Réponses: 8
    Dernier message: 22/12/2004, 22h57
  4. [SWT] Utilisation de la classe Tracker
    Par arN34 dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 24/11/2004, 10h28
  5. Réponses: 2
    Dernier message: 18/05/2004, 14h12

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