Premier Control vb.net

l informatiquepourtous Messages postés 1064 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 23 avril 2018 - 27 juil. 2011 à 11:45
 Utilisateur anonyme - 28 juil. 2011 à 22:39
Bonjour, à tous !
Je pense que çà dois être mon première passage sur le forum de vbfrance.
J'aurais besoin de votre aide pour affiner mon code.
Je suis en train de réalisé mon premier composant en vb.net
Un genre de progressbar qui augment à chaque niveau :



On va dire que j'ai fait çà un peu à l'arrache avec mes petit connaissance, mais je sais bien que c'est pas comme çà que je dois procéder.
Je vous rappelle que je suis très loin d'être un expert en code ! je suis à un niveau débutant +2ans
Merci de me dire comment amélioré mon composant.

Public Class progressview

   ' valeur c'est le nombre retourné
 Public valeur As Integer
'niveau c'est le nom de la propriété
    Public Property niveau() As Integer
        Get
            Return valeur
        End Get
        Set(ByVal value As Integer)

            valeur = value
'appelle ma sub pour changer l'image
            ajouterniveau()
        End Set
    End Property


    Sub ajouterniveau()
' ne permet pas de dépassé 13 ni 0 
        If valeur 0 Then valeur 1 Else valeur = valeur
        If valeur 13 Then valeur 13 Else valeur = valeur
'Change l'image par rapport  au niveau retournée 
        Me.BackgroundImage = System.Drawing.Image.FromFile("..\img" & valeur & ".png")

    End Sub

  
End Class

23 réponses

Utilisateur anonyme
27 juil. 2011 à 19:35
Bonsoir,
Ta blague est excellente
Bonne soirée.
0
l informatiquepourtous Messages postés 1064 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 23 avril 2018
27 juil. 2011 à 20:17
C'est encouragent ... çà donne envie de demandé des conseil.
Mais çà m'aide pas !
(Sinon le control fonctionne quand même, avec çà)


<
0
Utilisateur anonyme
27 juil. 2011 à 20:32
Excuse moi, je croyais que c'était une blague

Ta sub ajouterniveau() est inutile et son code peut être placée directement dans ta propriété.

Ceci ne sert à rien et peut être supprimé.
 Else valeur = valeur


Cette ligne est inutile puisque si valeur vaut 13, bien elle vaut 13 lol
If valeur 13 Then valeur 13 Else valeur = valeur


Si tu met :
Option Strict On

Tu constatera qu'écrire :
Image.FromFile("..\img" & valeur & ".png")

Ne peut pas fonctionner puisque un integer ne peut pas être concaténé avec un string.

Bon voilà pour les explications.
Je te jure que j'ai cru à une blague encore mes excuses
Bonne soirée.
0
l informatiquepourtous Messages postés 1064 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 23 avril 2018
27 juil. 2011 à 21:08
Oui désoler, pour :
If valeur 14 Then valeur 13 Else valeur = valeur
c'est 14 désoler

pour :
Image.FromFile("..\img" & valeur & ".png") çà fonctionne bien, j'ai nommer mes fichiers de 1 à 13, donc chaque niveau correspond à un fichier.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
27 juil. 2011 à 21:20
Je te rappelle que :
 Else valeur = valeur
Ne sert à rien.

En ce qui concerne :
Image.FromFile("..\img" & valeur & ".png") 

C'est un problème de type de variable qui pose problème.
"valeur" est de type Integer et "\img" ainsi que ".png" de type string.
Tu devrais plutôt écrire :
Image.FromFile("..\img" & valeur.ToString & ".png") 
0
l informatiquepourtous Messages postés 1064 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 23 avril 2018
27 juil. 2011 à 21:25
D'accord merci ! par contre ... quand j'exécute. et qu'il y as un changement de niveau celà fait charger l'image et donc çà fait un "freeze" noir, à cause de la transparence, je pense. Comment éviter çà ?
0
Utilisateur anonyme
27 juil. 2011 à 22:13
Tu dois signifier la couleur de transparence par exemple à un bitmap avant de le charger dans ton picturebox.
Using flux As New IO.FileStream("..\img" & valeur.ToString & ".png", IO.FileMode.OpenOrCreate)
    Dim b As New Bitmap(flux)
    b.MakeTransparent(Color.White)
    Me.BackgroundImage = b
End Using

Bonne soirée.
0
Utilisateur anonyme
27 juil. 2011 à 22:18
Petite remarque,
Ce n'est pas bon de charger une image a chaque fois depuis le disque.
Il vaudrait mieux charger en mémoire tes images (dans une List(Of Image) par exemple) au lancement de ton application et les appeler au changement de ta valeur.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 juil. 2011 à 07:55
Bonjour,
' ne permet pas de dépassé 13 ni 0
If valeur 0 Then valeur 1 Else valeur = valeur
If valeur 13 Then valeur 13 Else valeur = valeur

et (après "excuses")
If valeur 14 Then valeur 13 Else valeur = valeur

c'est 14 désoler

me laissent totalement muet pour au moins trois raisons, la pire étant la 3ème des 3, car j'imagine que, quelque-part ailleurs dans le code, valeur est augmentée d'une unité à chaque fois et que donc :
12 + 1 13>> image à charger ==>> + 1 = 14 ramené à 13 ===>> image à recharger ===>> + 1 = 14 ramené à 13 ===>> image à recharger ===>> +1 = 14 ramené à 13 ===>> image à recharger ===>> et ainsi de suiteet je fais le lien avec cette "observation" rapportée :

et donc çà fait un "freeze" noir, à cause de la transparence, je pense. Comment éviter çà ?

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
l informatiquepourtous Messages postés 1064 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 23 avril 2018
28 juil. 2011 à 11:29
ucfoutu > En fait non la valeur n'est pas augmenté à chaque fois.
C'est juste une protection ce code : 14=13 et 0=1 c'est pour les propriétés de l'objet.
Dans le code c'est :
Si valeur = entre 10 et 20 alors niveau 1
Si valeur = entre 20 et 30 alors niveau 2
Si valeur = entre 40 et 50 alors niveau 3
Etc... donc pas de possibilité de passer au dessus de mes 14 en exécutions.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 juil. 2011 à 11:39
Tu crois?
Mais :
- si tu l'as mis "pour rien" ===>> enlève le donc .
- si tu ne l'as pas mis "pour rien" ===>> la boucle infinie montrée du doigt sera présente.
Je ne te comprends vraiment pas, là !


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
l informatiquepourtous Messages postés 1064 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 23 avril 2018
28 juil. 2011 à 11:49
Dans le programme il est vrai qu'elle ne sert à rien mais ... dans VStudio si par exemple je met niveau = 50, dans propriété du control, il va me dire qu'il n'as pas trouvé l'image et donc me faire une erreur.


Par contre je comprend pas bien le principe de rendre transparent le bitmap :

Using flux As New IO.FileStream("..\img" & valeur.ToString & ".png", IO.FileMode.OpenOrCreate)

Dim b As New Bitmap(flux)
b.MakeTransparent(Color.Blue)
Me.BackgroundImage = b
End Using
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 juil. 2011 à 12:21
Je commencerais quand même à ta place par une petite précaution/vérification, car quand ça "freeze" et devient noir, cela révêle en général que la carte graphique ne opeut plus suivre, complètement exténuée.
ajoute un label à ton contrôle et incrémente-le de 1 unité à chaque fois que valeur = 13 et que tu charges l'image correspondante. Et vérifie que la valeur affichée dans ce label ne grandit pas à vue d'oeil.

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
l informatiquepourtous Messages postés 1064 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 23 avril 2018
28 juil. 2011 à 12:47
Je vais faire commencer par ta vérification, merci

J'ai fait une petit vidéo de 15 seconde pour vous montrez le freeze, c'est juste le contol qui clignote pas tout le programme ou l'écran. ->
Vidéo control
0
Utilisateur anonyme
28 juil. 2011 à 13:31
Il y a quelque temps, j'avais réalisé un petit vu-mètre pour un de mes projets.
Ici je n'ai dessiné que des lignes droites mais l'objet Graphics propose aussi de dessiner toutes sortes de formes comme les Curves les Ellipses.
En définissant l'angle d'un curve par exemple tu peux tracer des portions de cercles en définissant l'angle.

Tu pourras peut-être t'en inspirer :

Public Class Form1
    Dim WithEvents tmr As New Timer
    Dim rd As New Random
    Dim vu As New clsVuM

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Controls.Add(vu)
        tmr.Interval = 50
        tmr.Start()
    End Sub

    Private Sub tmr_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmr.Tick
        vu.L = rd.Next(0, 40000)
        vu.R = rd.Next(0, 40000)
    End Sub


    Public Class clsVuM
        Inherits PictureBox
        Dim _L, _R As Integer
        Dim vu As System.Timers.Timer = New System.Timers.Timer(50)

        Sub New()
            AddHandler vu.Elapsed, AddressOf vu_Elapsed
            With Me
                .BackColor = Color.Black
                .BorderStyle = Windows.Forms.BorderStyle.FixedSingle
                .Width = 60
                .Height = 100
            End With
            vu.Start()
        End Sub

        Private Sub vu_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)
            Try
                Me.Image = ImageVuMetre()
            Catch
            End Try
        End Sub

        Private Function ImageVuMetre(Optional ByVal Noir As Boolean = False) As Image
            Dim Larg As Integer = Me.Width - 2
            Dim Haut As Integer = Me.Height - 2
            Dim rect As New Rectangle(0, 0, Larg - 1, Haut - 1)
            Dim rectg As New Rectangle(0, 0, CType(Larg / 2, Integer), Haut)
            Dim rectd As New Rectangle(CType(Larg / 2, Integer), 0, Larg, Haut)
            Dim b As New Bitmap(rect.Width, rect.Height)
            Dim g As Graphics = Graphics.FromImage(b)
            Dim f As New Font("Arial", 20, FontStyle.Regular, GraphicsUnit.Pixel)
            g.FillRectangle(Brushes.Black, rect)
            If Noir Then Return CType(b.Clone, Image)
            Dim vg As Integer = CType((_L / 30000) * rectd.Height, Integer)
            Dim vd As Integer = CType((_R / 30000) * rectg.Height, Integer)

            For x = 0 To Haut
                If x Mod 25 = 0 Then
                    g.DrawLine(Pens.Gray, 0, Haut - x, Larg, Haut - x)
                End If
                If x Mod 2 = 0 Then
                    If x < vg Then
                        g.DrawLine(ChoixPen(x), 0, Haut - x, Convert.ToInt32(Larg / 2), Haut - x)
                    End If
                    If x < vd Then
                        g.DrawLine(ChoixPen(x), Convert.ToInt32(Larg / 2), Haut - x, Larg, Haut - x)
                    End If
                End If
            Next

            g.DrawString("G", f, Brushes.Black, 4, Haut - 25)
            g.DrawString("D", f, Brushes.Black, Convert.ToInt32(Larg / 2) + 4, Haut - 25)

            g.DrawRectangle(Pens.Black, rectg)
            g.DrawRectangle(Pens.Black, rectd)
            g.Dispose()
            Return CType(b.Clone, Image)
        End Function


        Private Function ChoixPen(ByVal Trigger As Integer) As Pen

            If Trigger >= 0 And Trigger < 25 Then
                Return Pens.GreenYellow
            ElseIf Trigger > 24 And Trigger < 50 Then
                Return Pens.Yellow
            ElseIf Trigger > 49 And Trigger < 75 Then
                Return Pens.Orange
            ElseIf Trigger >= 75 And Trigger <= 100 Then
                Return Pens.Red
            End If
            Return Nothing
        End Function


        WriteOnly Property L() As Integer
            Set(ByVal value As Integer)
                _L = value
            End Set
        End Property
        WriteOnly Property R() As Integer
            Set(ByVal value As Integer)
                _R = value
            End Set
        End Property
    End Class

End Class
0
l informatiquepourtous Messages postés 1064 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 23 avril 2018
28 juil. 2011 à 13:55
Merci de votre aide,
Je vais essayé de comprendre ce code, et voir comment faire des formes.
Mais çà me semble plus prometteur que mes image à 2 sous.
0
Utilisateur anonyme
28 juil. 2011 à 19:01
Tiens je te l'ai modifié pour que le résultat ressemble à ta vidéo :
Public Class Form1
    Dim WithEvents tmr As New Timer
    Dim rd As New Random
    Dim vu As New clsVuM

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Controls.Add(vu)
        tmr.Interval = 50
        tmr.Start()
    End Sub

    Private Sub tmr_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmr.Tick
        vu.L = rd.Next(0, 180)
        vu.R = rd.Next(0, 180)
    End Sub


    Public Class clsVuM
        Inherits PictureBox
        Dim _L, _R As Integer
        Dim Haut, Larg As Integer
        Dim vu As System.Timers.Timer = New System.Timers.Timer(50)

        Sub New()
            AddHandler vu.Elapsed, AddressOf vu_Elapsed
            With Me
                .BackColor = Color.Black
                .BorderStyle = Windows.Forms.BorderStyle.FixedSingle
                .Width = 100
                .Height = 200
            End With
            Larg = Me.Width / 2
            Haut = Me.Height / 2
            vu.Start()
        End Sub

        Private Sub vu_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)
            Try
                Me.Image = ImageVuMetre()
            Catch
            End Try
        End Sub

        Private Function ImageVuMetre(Optional ByVal Noir As Boolean = False) As Image
            Dim rect As New Rectangle(0, 0, 200, 200)
            Dim b As New Bitmap(rect.Width, rect.Height)
            Dim g As Graphics = Graphics.FromImage(b)
            Dim f As New Font("Arial", 20, FontStyle.Regular, GraphicsUnit.Pixel)
            g.FillRectangle(Brushes.Black, rect)
            If Noir Then Return CType(b.Clone, Image)

            For i = 180 To _L Step -5
                Dim x As Double = 100 * Math.Sin(i * (Math.PI / 180))
                Dim y As Double = 100 * Math.Cos(i * (Math.PI / 180))
                g.DrawLine(ChoixPen(i), 100, 100, 100 + Convert.ToInt32(x), 100 + Convert.ToInt32(y))
            Next
            b.RotateFlip(RotateFlipType.RotateNoneFlipX)
            b.RotateFlip(RotateFlipType.Rotate180FlipX)
            g.FillPie(Brushes.Black, New Rectangle(50, 50, 100, 100), 0, 360)
            g.Dispose()
            Return CType(b.Clone, Image)
        End Function


        WriteOnly Property L() As Integer
            Set(ByVal value As Integer)
                _L = value
            End Set
        End Property
        WriteOnly Property R() As Integer
            Set(ByVal value As Integer)
                _R = value
            End Set
        End Property


        Private Function ChoixPen(ByVal valeur As Double) As Pen
            Dim r, g, b As Double
            HlsToRgb(valeur, 0.5, 1, r, g, b)
            r *= 255
            g *= 255
            b *= 255
            Dim c As Color = New Color
            c = Color.FromArgb(r, g, b)
            Return New Pen(c, 3)
        End Function

        Private Sub HlsToRgb(ByVal H As Double, ByVal L As Double, ByVal S As Double, ByRef R As Double, ByRef G As _
            Double, ByRef B As Double)
            Dim p1 As Double
            Dim p2 As Double

            If L <= 0.5 Then
                p2 = L * (1 + S)
            Else
                p2 = L + S - L * S
            End If
            p1 = 2 * L - p2
            If S = 0 Then
                R = L
                G = L
                B = L
            Else
                R = QqhToRgb(p1, p2, H + 120)
                G = QqhToRgb(p1, p2, H)
                B = QqhToRgb(p1, p2, H - 120)
            End If
        End Sub

        Private Function QqhToRgb(ByVal q1 As Double, ByVal q2 As Double, ByVal hue As Double) As Double
            If hue > 360 Then
                hue -= 360
            ElseIf hue < 0 Then
                hue += 360
            End If
            If hue < 60 Then
                QqhToRgb = q1 + (q2 - q1) * hue / 60
            ElseIf hue < 180 Then
                QqhToRgb = q2
            ElseIf hue < 240 Then
                QqhToRgb = q1 + (q2 - q1) * (240 - hue) / 60
            Else
                QqhToRgb = q1
            End If
        End Function
    End Class

End Class
0
l informatiquepourtous Messages postés 1064 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 23 avril 2018
28 juil. 2011 à 19:13
Merci c'est très gentil, et très fort je trouve.
Je vais quand même essayé de le refaire par moi même pour voir si j'ai compris quelque chose.
0
Utilisateur anonyme
28 juil. 2011 à 20:25
La plupart du temps, en dessin à la volée, on doit forcément passer par la trigo. C'est pour ça qu'on ta bassiné avec les sinus et cosinus en 6ème (comme quoi ça à enfin une utilité lol)
Bon je t'ai commenté la fonction pour que tu comprenne bien.
N'hésite pas à modifier des valeurs à droite et à gauche pour bien comprendre.
Il faut bien que tu comprenne que la classe clsVuM est juste une picturebox classique puisque elle hérite de la classe standard (Inherits PictureBox).
Change aussi la hauteur et largeur Me.Width et Me.Height dans la classe clsVuM pour bien observer le comportement du dessin.
N'hésite pas à changer 180 en 360 pour avoir un cercle complet ca peut être joli.
Tu peux changer la vitesse du timer (j'ai mis 50ms)
        Private Function ImageVuMetre() As Image
            'déclaration d'un nouveau bitmap sur lequel on va dessiner
            Dim b As New Bitmap(200, 200)
            'déclaration de l'objet graphique qui va servir à dessiner sur le bitmap
            Dim g As Graphics = Graphics.FromImage(b)
            'là on dessine un fond noir sur tout le bitmap
            g.FillRectangle(Brushes.Black, b.GetBounds(GraphicsUnit.Pixel))
            'ici on fait varier un angle (i) de 180° à 0° en sautant de 5°
            'si tu remplace Step -5 par Step -1, tu n'aura pas l'effet de séparation (stries noires)
            For i = 180 To _L Step -1
                'bon là ce sont des maths (va voir tes cours de 6eme lol)
                Dim x As Double = 100 * Math.Sin(i * (Math.PI / 180))
                Dim y As Double = 100 * Math.Cos(i * (Math.PI / 180))
                'et la on dessine la ligne qui part du centre du cercle vers le point x,y
                'on choisit la couleur par la fonction ChoixPen avec l'angle en paramètre
                g.DrawLine(ChoixPen(i), 100, 100, 100 + Convert.ToInt32(x), 100 + Convert.ToInt32(y))
            Next
            'on fait pivoter le bitmap dans la position voulue
            b.RotateFlip(RotateFlipType.RotateNoneFlipX)
            b.RotateFlip(RotateFlipType.Rotate180FlipX)
            'et on dessine un cercle noir au centre
            g.FillPie(Brushes.Black, New Rectangle(50, 50, 100, 100), 0, 360)
            'on libère l'objet graphique
            g.Dispose()
            'et la fonction retourne l'image obtenue
            Return CType(b.Clone, Image)
        End Function

Bonne soirée.
0
l informatiquepourtous Messages postés 1064 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 23 avril 2018
28 juil. 2011 à 20:31
Merci beaucoup !!
C'est très clair tes explication !
C'est marrant j'ai toujours dit à mon prof de math que çà servais à rien ce qu'on apprenais, que çà manquais de concret, ba voilà là c'est tout de suite plus intéressent !
j'irais pas jusqu'à dire que j'aime les math mais ... c'est sympa !
0
Rejoignez-nous