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 :

Assombrir des couleurs [Débutant]


Sujet :

VB.NET

  1. #1
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut Assombrir des couleurs
    Bonjour,

    En m'inspirant d'un autre topic, j'ai créé une fonction qui assombrit des couleurs suivant un pourcentage. Le seul hic, c'est qu'elle ne fonctionne pas

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Function Darken(ByVal Col As Color, ByVal Percent As Integer) As Color
            Dim R, G, B As Integer
            R = Col.R
            G = Col.G
            B = Col.B
            R = Math.Max(Math.Min(Math.Round(R * Percent / 100), 255), 0)
            G = Math.Max(Math.Min(Math.Round(G * Percent / 100), 255), 0)
            B = Math.Max(Math.Min(Math.Round(B * Percent / 100), 255), 0)
            Return Color.FromArgb(RGB(R, G, B))
        End Function
    Je pense que c'est le return qui ne doit pas être bon. En m'aidant de l'aide de MSDN, j'ai cherché à transformé les 3 composante R, G, B en paramètre de type color.

    Mais cette fonction reste sans effet.

    Quelqu'un a-t-il une idée de la solution ?

  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
    en l'écrivant comme il faut elle a l'air de marcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     Function Darken(ByVal Col As Color, ByVal Percent As Integer) As Color
            Dim R, G, B As Byte
            R = Col.R
            G = Col.G
            B = Col.B
            R = CByte(Max(Min(System.Math.Round(R * Percent / 100), 255), 0))
            G = CByte(Max(Math.Min(System.Math.Round(G * Percent / 100), 255), 0))
            B = CByte(Max(Math.Min(Math.Round(B * Percent / 100), 255), 0))
            Return Color.FromArgb(Col.A, R, G, B)
        End Function
    il faut mettre option strict on dans le projet, ca souligne alors les erreurs qu'on écrit, et ca force à modifier comme ci dessus (les couleurs argb sont composés de 4 bytes, pas d'integer ; fromargb demande 4 paramètres etc....)


    après on réfléchit à ce qu'il y a d'écrit et/ou à ce qu'on veut faire et ca donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     Function Darken(ByVal Col As Color, ByVal Percent As Integer) As Color
            Dim R, G, B As Byte
            R = CByte(Col.R * Percent / 100)
            G = CByte(Col.G * Percent / 100)
            B = CByte(Col.B * Percent / 100)
            Return Color.FromArgb(Col.A, R, G, B)
        End Function
    avoir des lignes en plus et plus compliquées ne sert à rien ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    En fait, je les avais déclarés en integer car je plantais au moment de faire R*PERCENT, mais ce n'était visiblement pas la bonne solution.
    Pour le nombre d'arguments de FromArgb, cette fonction existe bien avec un seul argument, mais c'est vrai que c'est plus simple d'utiliser la surcharge à 4 arguments.

    Enfin et surtout, je ne comprends pas pourquoi les couleurs ne changent pas visuellement, même en corrigeant mon code, bien que le pas à pas montre que la fonction est correctement prise en compte.
    Ca marche chez toi ?

  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
    fait voir le reste de ton code

    ta fonction retourne une nouvelle couleur plus sombre à partir d'une couleur, si tu n'as rien écrit pour que ca agisse quelque part il ne se passera rien ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    J'utilise cette fonction lorsque je survole un point d'un chart pour le mettre en évidence :
    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
    Private Sub Chart1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Chart1.MouseMove
            ' Appel HitTest qui retourne l'objet sous le curseur
            Dim result As HitTestResult = Chart1.HitTest(e.X, e.Y)
            ' Remet sur toute la series les attributs normaux
            Dim point As DataPoint
            For Each point In Chart1.Series(0).Points
                point.BorderWidth = 1
            Next
            ' Si la souris est sur un data point
            If result.ChartElementType = ChartElementType.DataPoint And result.PointIndex <> -1 Then
                ' Chercher quel data point dans la series
                Dim point1 As DataPoint = Chart1.Series(0).Points(result.PointIndex)
                ' Changer l'apparence du data point survolé
                point1.Color = Darken(point1.Color, 5)
                point1.BorderWidth = 2
                Me.Cursor = New System.Windows.Forms.Cursor(My.Resources.cursor_loupe16.Handle)
            ElseIf result.ChartElementType = ChartElementType.LegendItem Then
                Dim point1 As DataPoint = Chart1.Series(0).Points(CType(result.Object, LegendItem).SeriesPointIndex)
                point1.BorderWidth = 2
            Else
                ' Curseur par défaut
                Me.Cursor = Cursors.Default
            End If
        End Sub

  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
    je ne suis pas expert en chart, mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    point1.Color = Darken(point1.Color, 5)
    m'a l'air bon

    tu peux mettre un point d'arrêt pour comparer la couleur du point avant et après, si la couleur change bien le problème vient d'ailleurs
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour pol63

    Darken est bon...ses deboires vienent je supoose de la couleur utilise (par defaut par exemple chart utilise des couleures à canal apha =0, transparent)..
    Comme dans Darken tu ne modifies pas normalement son canal aplha on obtient un resultat inattendu..effet de gomme...

    Code d'un chart sinus avec couleur par defaut:
    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
     
    Imports System.Windows.Forms.DataVisualization.Charting
     
    Public Class Form1
     
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim x As Double
            Dim y As Double
            For index = -100 To 100
                y = Math.Cos(x)
                x += 2 * Math.PI / 100
                Chart1.Series(0).Points.AddXY(x, y)
            Next
     
     
        End Sub
     
        Private Sub Chart1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Chart1.MouseMove
            ' Appel HitTest qui retourne l'objet sous le curseur
            Dim result As HitTestResult = Chart1.HitTest(e.X, e.Y)
            ' Remet sur toute la series les attributs normaux
            Dim point As DataPoint
            For Each point In Chart1.Series(0).Points
                point.BorderWidth = 2
                'supprimez le commentaire pour voir la diffrence 
                'avec couleur dont aplha <> 0
                'point.Color = Color.FromArgb(155, Color.Red)
            Next
            ' Si la souris est sur un data point
            If result.ChartElementType = ChartElementType.DataPoint And result.PointIndex <> -1 Then
                ' Chercher quel data point dans la series
                Dim point1 As DataPoint = Chart1.Series(0).Points(result.PointIndex)
                ' Changer l'apparence du data point survolé
                point1.Color = Darken(point1.Color, 50)
                point1.BorderWidth = 8
                Me.Cursor = Cursors.Hand
     
            Else
                ' Curseur par défaut
                Me.Cursor = Cursors.Default
            End If
     
        End Sub
        Function Darken(ByVal Col As Color, ByVal Percent As Integer) As Color
            Dim R, G, B As Byte
            Console.WriteLine(Col.A.ToString)
            R = CType(Col.R * Percent / 100, Byte)
            G = CType(Col.G * Percent / 100, Byte)
            B = CType(Col.B * Percent / 100, Byte)
     
            Return Color.FromArgb(Col.A, R, G, B)
        End Function
    End Class
    bon code......

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

Discussions similaires

  1. Des couleurs, des collones, un DBGRID, et une crise de nerfs
    Par Yepazix dans le forum Bases de données
    Réponses: 5
    Dernier message: 22/09/2004, 14h51
  2. TValueListEditor : Avoir des couleurs différentes par rangée
    Par Griswold dans le forum Composants VCL
    Réponses: 2
    Dernier message: 06/08/2004, 19h41
  3. Des couleurs en mode console
    Par davcha dans le forum MFC
    Réponses: 3
    Dernier message: 08/05/2004, 14h37
  4. [Debutant] gestion des couleurs ??
    Par MaxiMax dans le forum OpenGL
    Réponses: 5
    Dernier message: 26/03/2004, 08h34
  5. pb pour modifier la luminositée des couleurs
    Par mathieutlse dans le forum Langage
    Réponses: 2
    Dernier message: 08/01/2003, 14h45

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