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 :

Afficher du texte dans la progressbar


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut Afficher du texte dans la progressbar
    Bonjour à tous,
    Savez vous comment on fait pour afficher du texte dans une ProgressBar ?
    J'ai essayé ceci mais le texte disparaît entre 2 progressions :

    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
    Public Class frmRestartProcess
        Dim TimeMaxi As Integer = 10
        Dim CurrentTime As Integer = 0
        Private Sub frmRestartProcess_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            ProgressBar1.Maximum = TimeMaxi
            ProgressBar1.Value = 0
            Timer1.Interval = 1000
            Timer1.Start()
    End Sub
     
        Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick
            If CurrentTime = TimeMaxi Then
                DialogResult = Windows.Forms.DialogResult.Yes
                Me.Close()
                Exit Sub
            End If
            CurrentTime += 1
            ProgressBar1.Value = CurrentTime
     
            Dim myString As String = ((ProgressBar1.Value * 100) \ ProgressBar1.Maximum).ToString()
            myString &= "% Done"
            Dim canvas As Graphics = Me.ProgressBar1.CreateGraphics
            canvas.DrawString(myString, New Font("Verdana", 8, FontStyle.Regular), New SolidBrush(Color.Red), 90, 4)
            canvas.Dispose()
        End Sub
    End Class
    Merci beaucoup si vous pouvez m'aider.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 176
    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 176
    Points : 25 118
    Points
    25 118
    Par défaut
    il faut mettre ton drawstring sur l'event paint du progressbar, et utiliser e.graphics plutot que creategraphics

    quand l'event paint est levé, le controle se dessine, effacant tout ce qu'il y avait avant dessus

    pour demander le redessin (et donc la levée de l'event paint) il faut faire leprogressbar.invalidate

    il te faudra donc une variable de progression sur la classe pour que la valeur soit utilisable dans les 2 méthodes

  3. #3
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonsoir Pol63 et merci pour la réponse,
    Sauf erreur de ma part je n'ai pas trouvé l'evennement paint du progressbar qui semble pourtant exister d'après Msdn.
    C'est moi ou j'ai raté un truc ?

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 176
    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 176
    Points : 25 118
    Points
    25 118
    Par défaut
    il n'apparait pas dans la liste en effet
    par contre on peut l'écrire, mais il n'est pas levé :/


    sinon tu peux tenter un label transparent dessus
    edit : ne fonctionne pas non plus ...

  5. #5
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Bonjour,

    j'ai trouvé un bon tuto pour faire une progressebar perso, reste plus qu'a mettre le texte dans l’évènement paint : http://support.microsoft.com/kb/323088

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Merci Sankasss, mais j'aimerais quelques choses de plus simple et éviter les usercontrols si c'est possible.
    Ça n'a l'air de rien mais ce petit bout de code me pose beaucoup de problème.
    Le texte disparaît après chaque progression

  7. #7
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonsoir, quelqu'un peux m'aider à améliorer cette classe ?:
    A priori si je créer une progressbar avec les dimensions suivantes (200x20), il me manque un bout de texte.
    Je pense qu'il doit y avoir une erreur de calcul mais je ne sais pas vraiment manipuler les régions et autres clientRectangle...
    (Désolé pour le dérangement mais j'ai vraiment fait un tas d'essais sans réussir)

    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
    Imports System.ComponentModel
     
    Public Class TextProgressBar
        Inherits ProgressBar
        Private g As Graphics
     
        Protected Overrides Sub OnHandleCreated(ByVal e As System.EventArgs)
            MyBase.OnHandleCreated(e)
            g = Graphics.FromHwnd(Me.Handle)
        End Sub
     
        Protected Overrides Sub OnHandleDestroyed(ByVal e As System.EventArgs)
            g.Dispose()
            MyBase.OnHandleDestroyed(e)
        End Sub
     
        <EditorBrowsable(EditorBrowsableState.Always), Browsable(True)> _
        Public Overrides Property Font() As Font
            Get
                Return MyBase.Font
            End Get
            Set(ByVal value As Font)
                MyBase.Font = value
            End Set
        End Property
     
        Private Const WM_PAINT As Int32 = &HF
        Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
            MyBase.WndProc(m)
            If m.Msg = WM_PAINT Then
                TextOverlay()
            End If
        End Sub
     
        Private Sub TextOverlay()        
            Dim r1 As RectangleF = Me.ClientRectangle
            r1.Width = CSng(r1.Width * Me.Value / 100)
            Dim reg1 As New Region(r1)
            Dim reg2 As New Region(Me.ClientRectangle)
            reg2.Exclude(reg1)
     
            Dim text As String = Me.Value.ToString & "%"
            Dim textsize As SizeF = g.MeasureString(text, Me.Font)
            Dim x As Single = (Me.ClientRectangle.Width - textsize.Width) / 2
            Dim y As Single = (Me.ClientRectangle.Height - textsize.Height) / 2
            g.Clip = reg1
            g.DrawString(text, Me.Font, Brushes.White, x, y)
            g.Clip = reg2
            g.DrawString(text, Me.Font, Brushes.Black, x, y)
            reg1.Dispose()
            reg2.Dispose()
        End Sub
    End Class
    Merci beaucoup pour votre aide.

  8. #8
    Membre averti
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 478
    Points : 442
    Points
    442
    Par défaut
    J'ai trouvé kk chose qui pourrait t'interesser

    http://support.microsoft.com/kb/323088

    Comment créer un progressbarr perso avec du texte apparemment.( dans l'exemple ils mettent un timer)

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    674
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 674
    Points : 1 176
    Points
    1 176
    Par défaut
    Bonsoir,
    as tu créé la surface à dessiner sur le contrôle ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g = Me.CreateGraphics()

  10. #10
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    @Ashireon : lis la conversation, ce tuto a déjà été donné et BasicZX81 a dit qu'il préférait ne pas faire d'usercontrols.

    @BasicZX81 : d'ailleurs je comprend pas pourquoi vu que tu crées quand même un usercontrols qui hérite de ProgressBar que tu nommes TextProgressBar

  11. #11
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,
    Citation Envoyé par Sankasssss Voir le message
    @BasicZX81 : d'ailleurs je comprend pas pourquoi vu que tu crées quand même un usercontrols qui hérite de ProgressBar que tu nommes TextProgressBar
    En fait il fait une "classe Contrôle Personnalisé" (qui hérite d'un contrôle Windows Forms existant) qu'il faut ensuite coder pour personnaliser, pas un UserControl.
    http://msdn.microsoft.com/fr-fr/libr...(v=vs.71).aspx

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    674
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 674
    Points : 1 176
    Points
    1 176
    Par défaut
    Bonjour,
    Pour les différents types de contrôles :
    composites, étendus et personnalisés.

  13. #13
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Citation Envoyé par rv26t Voir le message
    En fait il fait une "classe Contrôle Personnalisé" (qui hérite d'un contrôle Windows Forms existant) qu'il faut ensuite coder pour personnaliser, pas un UserControl.
    http://msdn.microsoft.com/fr-fr/libr...(v=vs.71).aspx
    Ca j'avais compris
    Et la différence concrètement c'est quoi? un hérite de ProgressBar, l'autre de Control, donc c'est un terme qui change...

    @BasicZX81 : J'ai testé le composant et je n'ai aucun soucis au dimension que vous donnez, il fonctionne parfaitement et ne le texte ne dépasse pas

  14. #14
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par Sankasssss Voir le message
    Et la différence concrètement c'est quoi?
    Le "user controle" est un conteneur dans lequel on place (en design) un ensembles de contrôles. (label, textbox, bouton, ...) (nommé Contrôles composites dans MSDN)

    La "classe Contrôle Personnalisé", qui hérite d'un contrôle Windows Forms existant, permet par code de modifier et d'ajouter des fonctionnalités pour ce controle. (pas de design)

    Ce sujet a été abordé il y a peu http://www.developpez.net/forums/d12...m/#post6919746

    Voir le lien donné par "chrismonoye"
    Par contre dans MSDN la différence entre "Contrôles étendus" et "Contrôles personnalisés" est ténu.

  15. #15
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Je dois mal m'exprimer alors car ce que j'essaye de faire passer c'est qu'il y a pas besoin d'explication (c'était ironique) car c'est pas une question de fond, on connait la différence concrète...

    D'ailleurs si vous aviez remarqué, ce que l'on nomme depuis le début de la conversation comme userControl n'est qu'un control fait par code, dans notre cas il ne s'agit nullement d'un vrais userControl vu qu'on ne ferait que le coder de toute pièce sans ajouter de control.

    Donc nos deux cas sont identique, donc le lien proposé donnait bien un "Contrôle Personnalisé", désolé d'avoir abusé d'un mot mais il faut quand même s'adapter à la conversation...

  16. #16
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Votre lien était très bien.

    Désolé d'avoir été aussi pointilleux, (trop pointilleux) mais il faut aussi penser à certains débutants qui pourraient être dans le flou.

  17. #17
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonsoir, je me permet de faire remonter ce post. Je n'avait pas vu les réponses qui pourtant m'interresse beaucoup.
    Le contrôle fonctionne en effet mais uniquement lorsque il est crée en mode Design. Il doit y avoir un soucis quelque part mais je ne sait pas ou.

    Merci à Sankasssss d'avoir bien voulu tester le composant et merci également aux autres pour les réponses.

  18. #18
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Je viens de tester en plaçant le composant par code et j'ai effectivement le % qui est tronqué.
    J'ai vite essayé de comprendre pourquoi mais je ne vois pas, c'est à approfondir.

    Par contre j'ai du mal à comprendre l'utilité de la reg1 et de son exclude de reg2, en la mettant en commentaire comme ceci :
    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
            Private Sub TextOverlay()
                Debug.WriteLine(Now.ToString & " : TextOverlay pour la valeur " & Value)
                'Dim r1 As RectangleF = Me.ClientRectangle
                'r1.Width = CSng(r1.Width * Me.Value / 100)
                ' Dim reg1 As New Region(r1)
                Dim reg2 As New Region(Me.ClientRectangle)
                ' reg2.Exclude(reg1)
     
                Dim text As String = Me.Value.ToString & "%"
                Dim textsize As SizeF = g.MeasureString(text, Me.Font)
                Dim x As Single = (Me.ClientRectangle.Width - textsize.Width) / 2
                Dim y As Single = (Me.ClientRectangle.Height - textsize.Height) / 2
                'g.Clip = reg1
                'g.DrawString(text, Me.Font, Brushes.White, x, y)
                g.Clip = reg2
                g.DrawString(text, Me.Font, Brushes.Black, x, y)
                ' reg1.Dispose()
                reg2.Dispose()
     
            End Sub
    On arrive au même résultat, peux-tu m'éclairer quand à son utilité?

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    674
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 674
    Points : 1 176
    Points
    1 176
    Par défaut
    Bonjour
    Citation Envoyé par Sankasssss
    Je viens de tester en plaçant le composant par code et j'ai effectivement le % qui est tronqué.
    j'ai également remarqué ça dans le cas où l'on Add le contrôle sur le formulaire et que l'on définit ses propriétés ensuite :
    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
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     
            Me.Controls.Add(ProgressBar1)
     
            ProgressBar1.Maximum = TimeMaxi
            ProgressBar1.Value = 0
            ProgressBar1.Height = 20
            ProgressBar1.Width = 200
            ProgressBar1.Location = New Point(20, 300)
            ProgressBar1.Font = New Font("Arial", 12.0F, FontStyle.Regular)
     
            'Me.Controls.Add(ProgressBar1)
     
            Timer1.Interval = 100
            Timer1.Start()
        End Sub
    Placé en dernier, tout rentre dans l'ordre.
    Pour le premier cas, il faut redéfinir la surface de dessin comme je le disais si dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Private Sub TextOverlay()
     
            g = Me.CreateGraphics
            Dim r1 As RectangleF = Me.ClientRectangle
            r1.Width = CSng(r1.Width * Me.Value / 100)
            Dim reg1 As New Region(r1)
            Dim reg2 As New Region(Me.ClientRectangle)
            reg2.Exclude(reg1)
     
            'etc...
        End Sub

  20. #20
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    674
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 674
    Points : 1 176
    Points
    1 176
    Par défaut
    Re,
    le code des régions sert à changer la couleur du texte %, selon sa position dans la zone de progression ou dans le reste de la zone cliente du contrôle.
    Enfin visuellement, car le texte est dessiné en réalité dans les deux zones avec sa propre couleur.
    Reg1 est définie par le rectangle R1 qui augmente au rythme de la progression et Reg2 est le reste de la zone cliente, car elle se voit régulièrement emputée de Reg1 qui s'allonge (Exclude : zone cliente - Reg1).
    Enfin la propriété Clip limite la zone de dessin à ces deux zones et tout ce qui dépasse n'est pas dessiné.

    Exemple à 47% en décomposant les deux régions :


    Reg1 : |////////////// 47|%
    Reg2 : ...................47|% //////////////////|

    En vert texte non dessiné hors limite (Clip)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Afficher un texte dans la barre d'adresse dans charger l'URL
    Par d.w.d dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/04/2006, 11h14
  2. [VB6]Afficher du texte dans Textbox desactivé + scrollbar?
    Par toninlg dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/03/2006, 18h40
  3. Besoin d'aide pour afficher du text dans un applet
    Par argon dans le forum Applets
    Réponses: 2
    Dernier message: 15/01/2006, 21h53
  4. afficher du texte dans le champ de saisie de type file
    Par MANU_2 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 01/09/2005, 14h59
  5. Réponses: 2
    Dernier message: 10/06/2002, 11h03

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