Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

GRAPHIQUE FACILE A DESSINER : CAMEMBERT ET HISTOGRAMME


Information sur la source

Catégorie :Graphique Source .NET ( DotNet ) Classé sous : graphique, chart, gdi, camembert, histogramme Niveau : Débutant Date de création : 08/04/2006 Date de mise à jour : 13/04/2006 14:50:27 Vu / téléchargé: 34 345 / 2 090

Note :
7,5 / 10 - par 2 personnes
7,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (21)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Ce code permet de dessiner des camemberts et des histogramme facilement sans aucune API! certe c'est un peu réinventer la roue mais si comme moi vous n'arrivez pas a faire marche les objets fait pour afficher des graphe vous serez content de le trouver. Son principe est simple : il dessine lui même le camembert ou l'histogramme à même la form.
 

Source

  • Public Class Chart
  • Inherits CollectionBase
  • Implements IDisposable
  • 'hérite de la classe CollectionBase pour être une liste de ainsi profiter de toutes les méthode
  • 'de cette classe
  • 'liste et énumerateur pour les couleur
  • Dim LLCouleur As LinkedList(Of Color)
  • Private couleur As LinkedList(Of Color).Enumerator
  • 'autre variables
  • Public ShowText As Boolean
  • Public TextMode As TypeText
  • Public GraphMode As TypeGraph = TypeGraph.Pie2D
  • Public Font As Font
  • 'Enum afin de définir le type d'affichage du texte : %, val, les deux, ...
  • Public Enum TypeText
  • Pourcent = 0
  • Valeur = 1
  • PourcentPuisValeur = 2
  • ValeurPuisPourcent = 3
  • Pourcent_SautLigne_Valeur = 4
  • Valeur_SautLigne_Pourcent = 6
  • End Enum
  • 'type du graphique : histogramme (barres), camembert, d'autre aisément ajoutable
  • Public Enum TypeGraph
  • Pie2D = 0
  • Hist2D = 1
  • End Enum
  • Public Sub New(ByVal FontA As Font)
  • Font = FontA
  • 'list des couleurs que l'on affichera
  • LLCouleur = New LinkedList(Of Color)
  • LLCouleur.AddLast(Color.Thistle)
  • LLCouleur.AddLast(Color.Aqua)
  • LLCouleur.AddLast(Color.Coral)
  • LLCouleur.AddLast(Color.DeepSkyBlue)
  • LLCouleur.AddLast(Color.DarkSalmon)
  • LLCouleur.AddLast(Color.DarkOrchid)
  • couleur = LLCouleur.GetEnumerator
  • End Sub
  • 'ajoute de nv item au graph en spécifiant la couleur
  • Public Function Add(ByVal iValeur As Integer, ByVal Couleur As Color, Optional ByVal texte As String = "") As ChartItem
  • Dim oCI As New ChartItem(iValeur, Couleur, texte)
  • Me.List.Add(oCI)
  • Return oCI
  • End Function
  • 'se déclanche quand on a finit de vider un graph de ces items
  • Protected Overrides Sub OnClearComplete()
  • MyBase.OnClearComplete()
  • couleur = LLCouleur.GetEnumerator
  • End Sub
  • 'ajout de nv item sans spécifier la couleur
  • Public Function Add(ByVal iValeur As Integer, Optional ByVal texte As String = "") As ChartItem
  • 'si on est arriver a la fin de la liste des couleurs on revient au début
  • ' plus détaillé : quand le curseur à été parcouru on crée un nouveau curseur et on le position sur la
  • ' première couleur de la liste
  • If Not (couleur.MoveNext) Then
  • couleur = LLCouleur.GetEnumerator
  • couleur.MoveNext()
  • End If
  • Return Me.Add(iValeur, couleur.Current, texte)
  • End Function
  • 'accesseur en lecture seul pour les items
  • Default Public ReadOnly Property Item(ByVal iIndex As Integer) As ChartItem
  • Get
  • Return CType(Me.List.Item(iIndex), ChartItem)
  • End Get
  • End Property
  • 'calcule le total de valeur pour les items
  • 'on peut imaginer une évolution où l'utilisateur définirai lui même un max et si ce dernier est dépassé alors
  • 'et alors seulement on prend le mac réél
  • Public ReadOnly Property Total() As Integer
  • Get
  • Dim iTotal As Integer, iItem As ChartItem
  • For Each iItem In Me.List
  • iTotal += iItem.Valeur
  • Next
  • Return iTotal
  • End Get
  • End Property
  • 'demande le dessin du graphique en fonction du type définit en paramètre
  • Public Sub Draw(ByVal g As Graphics, ByVal oRect As Rectangle, ByVal type As TypeGraph)
  • 'g.DrawRectangle(System.Drawing.Pens.Black, oRect)
  • oRect.Height = oRect.Height - 2 * g.MeasureString("Test01", Me.Font).Height
  • oRect.Y = oRect.Y + g.MeasureString("Test01", Me.Font).Height
  • Select Case type
  • Case TypeGraph.Hist2D
  • DrawHist2D(g, oRect)
  • Case TypeGraph.Pie2D
  • 'on tranforme le rectangle en carré pour avoir un rond et non un oval
  • If oRect.Height < oRect.Width Then
  • oRect.X += (oRect.Width - oRect.Height) / 2
  • oRect.Width = oRect.Height
  • Else
  • oRect.Y += (oRect.Height - oRect.Width) / 2
  • oRect.Height = oRect.Width
  • End If
  • DrawPie2D(g, oRect)
  • End Select
  • End Sub
  • 'demande le dessin du graphique en fonction du type définit avant
  • Public Sub Draw(ByVal g As Graphics, ByVal oRect As Rectangle)
  • On Error Resume Next
  • 'on retrouve assez régulièrement des divisions par 0 dans les graphs si leurs tailles est petites
  • 'on on passe en cas de problème
  • Draw(g, oRect, Me.GraphMode)
  • End Sub
  • 'dessin l'histogramme
  • Private Sub DrawHist2D(ByVal g As Graphics, ByVal oRect As Rectangle)
  • Dim iItem As ChartItem
  • Dim iTotal As Integer = Total
  • Dim iMax As Integer = Integer.MinValue
  • Dim iRec As Rectangle
  • Dim iCpt As Integer = 0
  • Dim iLarg As Integer
  • Dim iUnite As Integer
  • Dim iX As Integer
  • Dim iPas As Integer = 0
  • Dim iText As String = 0
  • Dim iVal As String = 0
  • For Each iItem In Me.List
  • If iItem.Valeur > iMax Then iMax = iItem.Valeur
  • iCpt = iCpt + 1
  • Next
  • iLarg = Math.Min(((oRect.Width - 20) / iCpt), 40)
  • iPas = (oRect.Width - 20 - iLarg * iCpt) / iCpt
  • iUnite = oRect.Height / iMax
  • iX = oRect.X + 10 + iPas / 2
  • iRec.Width = iLarg
  • 'cadre
  • 'ordonné
  • g.DrawLine(Pens.Black, oRect.X, oRect.Y, oRect.X, oRect.Y + oRect.Height)
  • 'abcisse
  • g.DrawLine(Pens.Black, oRect.X + oRect.Width, oRect.Y + oRect.Height, oRect.X, oRect.Y + oRect.Height)
  • For Each iItem In Me.List
  • 'la barre
  • iRec.X = iX
  • iRec.Y = oRect.Y + (iMax - iItem.Valeur) * iUnite
  • iRec.Height = oRect.Y + oRect.Height - iRec.Y 'iItem.Valeur * iUnite
  • g.FillRectangle(iItem.Brush, iRec)
  • g.DrawRectangle(Pens.Black, iRec)
  • Dim sngAngle As Single = 360.0F * iItem.Valeur / iTotal
  • 'le texte
  • If ShowText Then
  • iVal = getTextVal(iItem, iTotal, TypeText.Valeur)
  • iText = iItem.texte
  • g.DrawString(iVal, Me.Font, Brushes.Black, iRec.X + iRec.Width / 2 - g.MeasureString(iVal, Me.Font).Width / 2, iRec.Y + iRec.Height / 2 - g.MeasureString(iVal, Me.Font).Height / 2)
  • g.DrawString(iText, Me.Font, Brushes.Black, iRec.X + iRec.Width / 2 - g.MeasureString(iText, Me.Font).Width / 2, iRec.Y + iRec.Height + g.MeasureString(iText, Me.Font).Height / 2)
  • End If
  • iX += iPas + iLarg
  • Next
  • End Sub
  • 'dessin le camembert
  • Private Sub DrawPie2D(ByVal g As Graphics, ByVal oRect As Rectangle)
  • Dim iItem As ChartItem, sngCurrentStartAngle As Single
  • Dim iTotal As Integer = Total
  • For Each iItem In Me.List
  • 'le camembert
  • Dim sngAngle As Single = 360.0F * iItem.Valeur / iTotal
  • g.FillPie(iItem.Brush, oRect, sngCurrentStartAngle, sngAngle)
  • g.DrawPie(Pens.Black, oRect, sngCurrentStartAngle, sngAngle)
  • 'le texte
  • If ShowText Then
  • Dim sText As String = ""
  • sText = iItem.texte + " : " + getTextVal(iItem, iTotal)
  • 'position du texte
  • Dim sngX, sngY As Single, sngAngleRadian As Single
  • sngAngleRadian = CType((sngCurrentStartAngle + sngAngle / 2) * Math.PI / 180, Single)
  • sngX = CType(oRect.X + oRect.Width / 2, Single)
  • sngX += CType((oRect.Width / 2) * Math.Cos(sngAngleRadian), Single)
  • If Math.Cos(sngAngleRadian) < 0 Then
  • sngX -= g.MeasureString(sText, Me.Font).Width
  • End If
  • sngY = CType(oRect.Y + oRect.Height / 2, Single)
  • sngY += CType((oRect.Height / 2) * Math.Sin(sngAngleRadian), Single)
  • If Math.Sin(sngAngleRadian) < 0 Then
  • sngY -= g.MeasureString(sText, Me.Font).Height
  • End If
  • g.DrawString(sText, Me.Font, Brushes.Black, sngX, sngY)
  • End If
  • sngCurrentStartAngle += sngAngle
  • Next
  • End Sub
  • 'un sort de garbage collector : libert la mémoire utiliser par lui et ses objets
  • Public Sub Dispose() Implements IDisposable.Dispose
  • Dim iItem As ChartItem
  • For Each iItem In Me.List
  • iItem.Dispose()
  • Next
  • Me.List.Clear()
  • End Sub
  • 'retourn le texte a affiché dans les graphique en fonction du type définit avant
  • Private Function getTextVal(ByRef iItem As ChartItem, ByVal iTotal As Integer) As String
  • Return getTextVal(iItem, iTotal, Me.TextMode)
  • End Function
  • 'retourn le texte a affiché dans les graphique en fonction du type passé en paramètre
  • Private Function getTextVal(ByRef iItem As ChartItem, ByVal iTotal As Integer, ByRef leTextMode As TypeText) As String
  • Select Case leTextMode
  • Case TypeText.Pourcent
  • Return (100 * iItem.Valeur / iTotal).ToString("#.#") & " %"
  • Case TypeText.Valeur
  • Return iItem.Valeur.ToString
  • Case TypeText.PourcentPuisValeur
  • Return (100 * iItem.Valeur / iTotal).ToString("#.#") & " %" + _
  • " (" + iItem.Valeur.ToString + "/" + iTotal.ToString + ")"
  • Case TypeText.Pourcent_SautLigne_Valeur
  • Return (100 * iItem.Valeur / iTotal).ToString("#.#") & " %" + vbNewLine + _
  • "(" + iItem.Valeur.ToString + "/" + iTotal.ToString + ")"
  • Case TypeText.Valeur_SautLigne_Pourcent
  • Return iItem.Valeur.ToString + vbNewLine + "(" + (100 * iItem.Valeur / iTotal).ToString("#.#") & " %" + ")"
  • End Select
  • 'case TypeText.ValeurPuisPourcent
  • Return iItem.Valeur.ToString + " (" + (100 * iItem.Valeur / iTotal).ToString("#.#") & " %" + ")"
  • End Function
  • End Class
  • Public Class ChartItem
  • Implements IDisposable
  • 'objet du graphique : ce sera une "part" du camembert, une barre de l'histogramme, ...
  • Public Valeur As Integer
  • Public texte As String
  • Private _Couleur As Color
  • Private _Brush As Brush
  • Public Sub New()
  • Couleur = Color.White 'couleur par défaut
  • End Sub
  • Public Sub New(ByVal iValeur As Integer, ByVal CouleurA As Color, ByVal newTexte As String)
  • Me.New()
  • Valeur = iValeur
  • Couleur = CouleurA
  • texte = newTexte
  • End Sub
  • Public Sub Dispose() Implements IDisposable.Dispose
  • If Not _Brush Is Nothing Then _Brush.Dispose()
  • End Sub
  • Public Property Couleur() As Color
  • Get
  • Return _Couleur
  • End Get
  • Set(ByVal Value As Color)
  • _Couleur = Value
  • End Set
  • End Property
  • Public Property Brush() As Brush
  • Get
  • If _Brush Is Nothing Then
  • Return New SolidBrush(Me.Couleur)
  • End If
  • Return _Brush
  • End Get
  • Set(ByVal Value As Brush)
  • _Brush = Value
  • End Set
  • End Property
  • End Class
Public Class Chart
    Inherits CollectionBase
    Implements IDisposable
    'hérite de la classe CollectionBase pour être une liste de ainsi profiter de toutes les méthode
    'de cette classe

    'liste et énumerateur pour les couleur
    Dim LLCouleur As LinkedList(Of Color)
    Private couleur As LinkedList(Of Color).Enumerator
    'autre variables
    Public ShowText As Boolean
    Public TextMode As TypeText
    Public GraphMode As TypeGraph = TypeGraph.Pie2D
    Public Font As Font

    'Enum afin de définir le type d'affichage du texte : %, val, les deux, ...
    Public Enum TypeText
        Pourcent = 0
        Valeur = 1
        PourcentPuisValeur = 2
        ValeurPuisPourcent = 3
        Pourcent_SautLigne_Valeur = 4
        Valeur_SautLigne_Pourcent = 6
    End Enum

    'type du graphique : histogramme (barres), camembert, d'autre aisément ajoutable
    Public Enum TypeGraph
        Pie2D = 0
        Hist2D = 1
    End Enum

    Public Sub New(ByVal FontA As Font)
        Font = FontA
        'list des couleurs que l'on affichera
        LLCouleur = New LinkedList(Of Color)
        LLCouleur.AddLast(Color.Thistle)
        LLCouleur.AddLast(Color.Aqua)
        LLCouleur.AddLast(Color.Coral)
        LLCouleur.AddLast(Color.DeepSkyBlue)
        LLCouleur.AddLast(Color.DarkSalmon)
        LLCouleur.AddLast(Color.DarkOrchid)
        couleur = LLCouleur.GetEnumerator
    End Sub

    'ajoute de nv item au graph en spécifiant la couleur
    Public Function Add(ByVal iValeur As Integer, ByVal Couleur As Color, Optional ByVal texte As String = "") As ChartItem
        Dim oCI As New ChartItem(iValeur, Couleur, texte)
        Me.List.Add(oCI)
        Return oCI
    End Function

    'se déclanche quand on a finit de vider un graph de ces items
    Protected Overrides Sub OnClearComplete()
        MyBase.OnClearComplete()
        couleur = LLCouleur.GetEnumerator
    End Sub

    'ajout de nv item sans spécifier la couleur
    Public Function Add(ByVal iValeur As Integer, Optional ByVal texte As String = "") As ChartItem
        'si on est arriver a la fin de la liste des couleurs on revient au début
        ' plus détaillé : quand le curseur à été parcouru on crée un nouveau curseur et on le position sur la 
        ' première couleur de la liste
        If Not (couleur.MoveNext) Then
            couleur = LLCouleur.GetEnumerator
            couleur.MoveNext()
        End If
        Return Me.Add(iValeur, couleur.Current, texte)
    End Function

    'accesseur en lecture seul pour les items
    Default Public ReadOnly Property Item(ByVal iIndex As Integer) As ChartItem
        Get
            Return CType(Me.List.Item(iIndex), ChartItem)
        End Get
    End Property

    'calcule le total de valeur pour les items
    'on peut imaginer une évolution où l'utilisateur définirai lui même un max et si ce dernier est dépassé alors
    'et alors seulement on prend le mac réél
    Public ReadOnly Property Total() As Integer
        Get
            Dim iTotal As Integer, iItem As ChartItem
            For Each iItem In Me.List
                iTotal += iItem.Valeur
            Next
            Return iTotal
        End Get
    End Property

    'demande le dessin du graphique en fonction du type définit en paramètre
    Public Sub Draw(ByVal g As Graphics, ByVal oRect As Rectangle, ByVal type As TypeGraph)
        'g.DrawRectangle(System.Drawing.Pens.Black, oRect)
        oRect.Height = oRect.Height - 2 * g.MeasureString("Test01", Me.Font).Height
        oRect.Y = oRect.Y + g.MeasureString("Test01", Me.Font).Height
        Select Case type
            Case TypeGraph.Hist2D
                DrawHist2D(g, oRect)
            Case TypeGraph.Pie2D
                'on tranforme le rectangle en carré pour avoir un rond et non un oval
                If oRect.Height < oRect.Width Then
                    oRect.X += (oRect.Width - oRect.Height) / 2
                    oRect.Width = oRect.Height
                Else
                    oRect.Y += (oRect.Height - oRect.Width) / 2
                    oRect.Height = oRect.Width
                End If
                DrawPie2D(g, oRect)
        End Select
    End Sub

    'demande le dessin du graphique en fonction du type définit avant
    Public Sub Draw(ByVal g As Graphics, ByVal oRect As Rectangle)
        On Error Resume Next
        'on retrouve assez régulièrement des divisions par 0 dans les graphs si leurs tailles est petites
        'on on passe en cas de problème
        Draw(g, oRect, Me.GraphMode)
    End Sub

    'dessin l'histogramme
    Private Sub DrawHist2D(ByVal g As Graphics, ByVal oRect As Rectangle)
        Dim iItem As ChartItem
        Dim iTotal As Integer = Total
        Dim iMax As Integer = Integer.MinValue
        Dim iRec As Rectangle
        Dim iCpt As Integer = 0
        Dim iLarg As Integer
        Dim iUnite As Integer
        Dim iX As Integer
        Dim iPas As Integer = 0
        Dim iText As String = 0
        Dim iVal As String = 0

        For Each iItem In Me.List
            If iItem.Valeur > iMax Then iMax = iItem.Valeur
            iCpt = iCpt + 1
        Next
        iLarg = Math.Min(((oRect.Width - 20) / iCpt), 40)
        iPas = (oRect.Width - 20 - iLarg * iCpt) / iCpt
        iUnite = oRect.Height / iMax
        iX = oRect.X + 10 + iPas / 2
        iRec.Width = iLarg
        'cadre
        'ordonné
        g.DrawLine(Pens.Black, oRect.X, oRect.Y, oRect.X, oRect.Y + oRect.Height)
        'abcisse
        g.DrawLine(Pens.Black, oRect.X + oRect.Width, oRect.Y + oRect.Height, oRect.X, oRect.Y + oRect.Height)

        For Each iItem In Me.List
            'la barre
            iRec.X = iX
            iRec.Y = oRect.Y + (iMax - iItem.Valeur) * iUnite
            iRec.Height = oRect.Y + oRect.Height - iRec.Y 'iItem.Valeur * iUnite
            g.FillRectangle(iItem.Brush, iRec)
            g.DrawRectangle(Pens.Black, iRec)

            Dim sngAngle As Single = 360.0F * iItem.Valeur / iTotal

            'le texte
            If ShowText Then
                iVal = getTextVal(iItem, iTotal, TypeText.Valeur)
                iText = iItem.texte

                g.DrawString(iVal, Me.Font, Brushes.Black, iRec.X + iRec.Width / 2 - g.MeasureString(iVal, Me.Font).Width / 2, iRec.Y + iRec.Height / 2 - g.MeasureString(iVal, Me.Font).Height / 2)
                g.DrawString(iText, Me.Font, Brushes.Black, iRec.X + iRec.Width / 2 - g.MeasureString(iText, Me.Font).Width / 2, iRec.Y + iRec.Height + g.MeasureString(iText, Me.Font).Height / 2)
            End If
            iX += iPas + iLarg
        Next

    End Sub

    'dessin le camembert
    Private Sub DrawPie2D(ByVal g As Graphics, ByVal oRect As Rectangle)
        Dim iItem As ChartItem, sngCurrentStartAngle As Single
        Dim iTotal As Integer = Total
        For Each iItem In Me.List
            'le camembert
            Dim sngAngle As Single = 360.0F * iItem.Valeur / iTotal
            g.FillPie(iItem.Brush, oRect, sngCurrentStartAngle, sngAngle)
            g.DrawPie(Pens.Black, oRect, sngCurrentStartAngle, sngAngle)

            'le texte
            If ShowText Then
                Dim sText As String = ""
                sText = iItem.texte + " : " + getTextVal(iItem, iTotal)

                'position du texte
                Dim sngX, sngY As Single, sngAngleRadian As Single
                sngAngleRadian = CType((sngCurrentStartAngle + sngAngle / 2) * Math.PI / 180, Single)
                sngX = CType(oRect.X + oRect.Width / 2, Single)
                sngX += CType((oRect.Width / 2) * Math.Cos(sngAngleRadian), Single)
                If Math.Cos(sngAngleRadian) < 0 Then
                    sngX -= g.MeasureString(sText, Me.Font).Width
                End If
                sngY = CType(oRect.Y + oRect.Height / 2, Single)
                sngY += CType((oRect.Height / 2) * Math.Sin(sngAngleRadian), Single)
                If Math.Sin(sngAngleRadian) < 0 Then
                    sngY -= g.MeasureString(sText, Me.Font).Height
                End If

                g.DrawString(sText, Me.Font, Brushes.Black, sngX, sngY)
            End If

            sngCurrentStartAngle += sngAngle
        Next
    End Sub

    'un sort de garbage collector : libert la mémoire utiliser par lui et ses objets
    Public Sub Dispose() Implements IDisposable.Dispose
        Dim iItem As ChartItem
        For Each iItem In Me.List
            iItem.Dispose()
        Next
        Me.List.Clear()
    End Sub

    'retourn le texte a affiché dans les graphique en fonction du type définit avant
    Private Function getTextVal(ByRef iItem As ChartItem, ByVal iTotal As Integer) As String
        Return getTextVal(iItem, iTotal, Me.TextMode)
    End Function

    'retourn le texte a affiché dans les graphique en fonction du type passé en paramètre
    Private Function getTextVal(ByRef iItem As ChartItem, ByVal iTotal As Integer, ByRef leTextMode As TypeText) As String
        Select Case leTextMode
            Case TypeText.Pourcent
                Return (100 * iItem.Valeur / iTotal).ToString("#.#") & " %"

            Case TypeText.Valeur
                Return iItem.Valeur.ToString

            Case TypeText.PourcentPuisValeur
                Return (100 * iItem.Valeur / iTotal).ToString("#.#") & " %" + _
                        " (" + iItem.Valeur.ToString + "/" + iTotal.ToString + ")"

            Case TypeText.Pourcent_SautLigne_Valeur
                Return (100 * iItem.Valeur / iTotal).ToString("#.#") & " %" + vbNewLine + _
                        "(" + iItem.Valeur.ToString + "/" + iTotal.ToString + ")"

            Case TypeText.Valeur_SautLigne_Pourcent
                Return iItem.Valeur.ToString + vbNewLine + "(" + (100 * iItem.Valeur / iTotal).ToString("#.#") & " %" + ")"
        End Select
        'case TypeText.ValeurPuisPourcent
        Return iItem.Valeur.ToString + " (" + (100 * iItem.Valeur / iTotal).ToString("#.#") & " %" + ")"
    End Function
End Class

Public Class ChartItem
    Implements IDisposable
    'objet du graphique : ce sera une "part" du camembert, une barre de l'histogramme, ...
    Public Valeur As Integer
    Public texte As String
    Private _Couleur As Color
    Private _Brush As Brush

    Public Sub New()
        Couleur = Color.White   'couleur par défaut
    End Sub

    Public Sub New(ByVal iValeur As Integer, ByVal CouleurA As Color, ByVal newTexte As String)
        Me.New()
        Valeur = iValeur
        Couleur = CouleurA
        texte = newTexte
    End Sub

    Public Sub Dispose() Implements IDisposable.Dispose
        If Not _Brush Is Nothing Then _Brush.Dispose()
    End Sub

    Public Property Couleur() As Color
        Get
            Return _Couleur
        End Get
        Set(ByVal Value As Color)
            _Couleur = Value
        End Set
    End Property

    Public Property Brush() As Brush
        Get
            If _Brush Is Nothing Then
                Return New SolidBrush(Me.Couleur)
            End If
            Return _Brush
        End Get
        Set(ByVal Value As Brush)
            _Brush = Value
        End Set
    End Property
End Class

Conclusion

Le code initial n'est pas de moi, je l'ai récupéré et j'ai ajouté la fonction d'histogramme, et la "génération" automatique de couleur.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

13 avril 2006 14:50:27 :
des commentaires d'ajoutés, et des façons d'afficher les valeurs aussi : pourcentage, valeur, les deux, ...

Commentaires et avis

signaler à un administrateur
Commentaire de TroXsA le 08/04/2006 20:08:37

Bonjour,

pas mal comme exemple ! :)

www.troxsa.info

signaler à un administrateur
Commentaire de crossblade le 09/04/2006 12:46:01

ouais plutôt amusant 8/10

signaler à un administrateur
Commentaire de NHenry le 10/04/2006 15:48:32

# If Not (couleur.MoveNext) Then
#             couleur = LLCouleur.GetEnumerator
#             couleur.MoveNext()
#         End If
Si je ne me trompe pas, tu avance de 2 pas dans couleur non aulieu de 1 pas.

signaler à un administrateur
Commentaire de Icarius44 le 13/04/2006 14:46:30

# If Not (couleur.MoveNext) Then
#             couleur = LLCouleur.GetEnumerator
#             couleur.MoveNext()
#         End If
Je n'avance que de 1 pas : c'est si j'arrive pas à avancer je recrée un nouveau curseur que je fait ensuite avance pour qu'il pointe sur la première couleur

signaler à un administrateur
Commentaire de NHenry le 13/04/2006 15:32:05

Exact, j'avais mal traduit.
désolé.

signaler à un administrateur
Commentaire de amohammed le 21/07/2007 12:52:46

Bonjour,

Excellent comme exemple !!

Ptite question SVP : je voudrais exporter les donner se trouvant dans un GridView vers un fichier Word sous forme d'un tableau, bien sûr, avec un camembert juste en dessous.

Que devrais-je rajouter au code ci-dessus pour le faire ?

Merci d'avance.

signaler à un administrateur
Commentaire de Maxime31 le 16/10/2007 20:07:31

Comment agrandit le camembert ?

signaler à un administrateur
Commentaire de othinakiway le 05/05/2009 19:45:52 8/10

Salut,
J'aime l'esprit simple chez les gents moi !, j'adore ton exemple, je te donne 8/10 .
Bonne continuité !

signaler à un administrateur
Commentaire de othinakiway le 18/05/2009 13:29:38

salut,
bah on fait comment pour ajouter les graduation au axe des ordonnées de l'histogramme!!?

signaler à un administrateur
Commentaire de Icarius44 le 18/05/2009 13:37:06

De mémoire il n'y en a pas, mais un petit for à la ligne 147 devrait suffir.

signaler à un administrateur
Commentaire de othinakiway le 18/05/2009 22:28:47

ok!, mrc bien je vais me débrouiller pour sa !

signaler à un administrateur
Commentaire de othinakiway le 19/05/2009 00:44:15

salut,
c encore moi.. j'ai réussi à graduer l'axe des ordonnées mais les graduants ne sont pas proportionnels avec les valeurs contenus dans l'histogramme.. voila le code que j'ai fait :
' graduation des ordonnées
            Dim i, val, graduant As Integer
            val = iMax
            For i = oRect.Y + oRect.Height To oRect.Y - oRect.Height / 5 Step -oRect.Height / 5
                g.DrawLine(Pens.Black, oRect.X, i, oRect.X - 4, i)
                While (val Mod 5 <> 0)
                    val += 1
                End While
                g.DrawString(graduant, Me.Font, Brushes.Black, oRect.X - 20, i - g.MeasureString(graduant.ToString, Me.Font).Height / 2)
                graduant += val / 5
            Next

signaler à un administrateur
Commentaire de Icarius44 le 19/05/2009 09:34:41

For i = oRect.Y + oRect.Height To oRect.Y - oRect.Height / 5 Step ...
Tu sort du rectangle de dessin, c'est :
For i = oRect.Y + oRect.Height To oRect.Y Step -oRect.Height / 5

De là je ne comprend pas pourquoi tu te prend la tête avec 3 variable, "i" est suffisante.

For i = oRect.Y + oRect.Height To oRect.Y Step -oRect.Height / 5
     g.DrawLine(Pens.Black, oRect.X, i, oRect.X - 4, i)
     g.DrawString(CType(i/iUnite,Integer).ToString, Me.Font, Brushes.Black, oRect.X - 20, i - g.MeasureString(graduant.ToString, Me.Font).Height / 2)
Next

iUnite est un coefficient de mise à l'échelle entre le max des items et la hauteur du cadre. (calculé ligne 139)

P.S: mon cast est peut-être pas bon, je n'ai pas de compilo VB sous la main.

enjoy !

signaler à un administrateur
Commentaire de othinakiway le 22/05/2009 23:45:20

il y'a tjr le mm problème, si tu veux bien me donner l'échelle val/pct ou me montrer moi comment le calculer...j'en serai ravi

signaler à un administrateur
Commentaire de othinakiway le 22/05/2009 23:55:25

pardon!..me montrer comment le calculer

signaler à un administrateur
Commentaire de Icarius44 le 23/05/2009 00:12:50

en effet, petite erreur.

CType((i-oRect.Y Step)/iUnite,Integer)

signaler à un administrateur
Commentaire de othinakiway le 23/05/2009 22:43:52

tu vx dire koi par "step" , sa génère une erreur...?????

signaler à un administrateur
Commentaire de othinakiway le 23/05/2009 23:26:59

en tt k si on enlève "step" (que je vois pas sa nécessité) le prob reste le mm

signaler à un administrateur
Commentaire de Icarius44 le 25/05/2009 00:05:23

Step : err de copier coller

ensuite, i va aller de oRect.Y + oRect.Height à oRect.Y, donc i-oRect.Y va aller de 0 à oRect.Height. ensuite si tu divise cette valeur pas iUnite, en 0 ça te donne 0 et en oRect.Height ça te donne oRect.Height / ( oRect.Height / iMax ) = oRect.Height*iMax/oRect.Height = iMax, donc la valeur ira donc de 0 à iMax. Après tu definit ton pas comme ceci : -oRect.Height / nbDessin.

Ton problème vient peut-être du fait que tu appelle la fonction avec la mauvaise zone de dessin (trop grande)

signaler à un administrateur
Commentaire de othinakiway le 25/05/2009 13:03:09

salut,
t'as été très clair..mrc, ms il manque une petite chose: quelle est d'après toi la zone idéale de dessin, quelle est la valeur que doit prendre "nbDessin"

signaler à un administrateur
Commentaire de Icarius44 le 25/05/2009 13:31:11

nbDessin c'est le nombre de graduation de ton axe des ordonnées.

"zone idéale de dessin" celle que tu veux, ce qu'il faut par contre c'est que l'appelle à la fonction passe bien les paramètres auquel tu pense.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

C'est compliqué le MS CHART !!!!! [ par reyman ] 1)Lorsque l'on trace un graphique de 10 valeurs, le prog affiche automatiquement en abcisse '1 2 3....10'Comment faire pour qu'il n'affiche que 2 vale chart access vba maj d'un graphique avec de nx paramètres [ par vincent82 ] bonjour,qq'un pourrait il m indiquer comment recharger un graphique basé sur une requète ?y a t'il un méthode quelconque permettant de le faire ?pb : Définir les données a visionner dans un graphique [ par kaira008 ] Bonjour a tous,Voila j'ai une base de donnée access avec des données a l'intérieur je m'en sert pour tracer un graphique sous excel. Donc pour résumer Sauvegarde d'un graphique en gdi+ [ par ludovicanceaux ] Salut &#224; tous, J'ai une appli vb.net, et un picturebox avec un graphique fait en gdi+ et je voudrais savoir komment sauvegarder ds un fichier ce g PB URGENT LEGENDE DU GRAPHIQUE [ par audrey35 ] JE d&#233;bute dans la programmation de VB et j'ai un pb de graphique. j'ai t&#233;l&#233;charger chart director et je fais un camembert. Jusque la j' EXCEL ET VB6 !!!!!!! [ par jimmy28 ] Salut &#224; tous,Je me&nbsp;prends d&#233;s&#233;sp&#233;r&#233;ment la t&#234;te sur un graphique excel cr&#233;&#233; &#224; partir de VB6 afin de MS Chart [ par briwax ] Salut tt le monde,je vous expose mon probl&#232;me rapidement : j'aimerais r&#233;aliser un graphique en courbe avec en entr&#233;e des coordonn&#233; graphique VB.NET (courbe + histogramme) [ par cameleon044 ] Bonjour, Voilà j'ai un petit problème en VB.NET ave cvisual studio 2003 sous windows 2000.Je voudrais faire un graphique avec un histogramme et une co Création d'un graph avec Chart (objet : Graphique Microsoft Graph) [ par antoine_ferard ] Hello tout le monde...- J'ai une application VB6 dans laquelle en cliquant sur un bouton un calcul s'effectue pour initialiser des variables et génére Boucle dans graphique [ par audreyP ] bonjour, je souhaite faire un camembert. J'ai ma plage de données qui contient 4 colonnes, et je voudrais que pour chaque colonne obtenir un camember


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


LG KP501

Entre 9€ et 159€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 1,295 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.