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 :

Changer la couleur du Pen et d'un point [Débutant]


Sujet :

VB.NET

  1. #1
    Membre confirmé Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut Changer la couleur du Pen et d'un point
    Bonjour, encore moi ...
    Je voudrais changer la couleur d'un Pen de nombreuses fois. Les renseignements trouvés indiquent toujours des instructions telles que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Dim Crayon As New Pen(Color.Black)
    qui fixe la couleur, ici Color.Black et ne peut être répétée

    J'ai essayé de réaliser ce changement de couleur à l'intérieur d'une boucle telle que : (j'ai abrégé le contenu réel)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       For i = 1 To 2000
                Teinte = ...
                Crayon.Color = Color.FromArgb(255, Teinte, Teinte, Teinte)
                Graphe.DrawLine(Crayon, x1,y1,x2,y2)
                ...
       Next
    Ca ne fonctionne pas. Est-ce dû à une erreur de principe du genre :
    la couleur du Pen doit être définie dans le Dim !!!
    Crayon.Color ne change pas la couleur du crayon !!!

    Dans ce cas quelle méthode utiliser ?
    Si la méthode vous semble bonne, dites le moi que je cherche ailleurs la source de ce dysfonctionnement.

    Autre question, Drawline ne semble pas fonctionner avec une ligne réduite à un seul point c'est à dire (x,y,x,y), est-ce normal ?

    Merci d'avance

  2. #2
    Membre confirmé Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut
    Je me réponds, après de nombreux tests il s'avère qu'en ouvrant un projet avec juste une déclaration de classe Form1 et en y ajoutant le code suivant ça fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
            Dim teinte As Integer = 200
            Dim Crayon As New Pen(Color.Red, 4)
     
            Crayon.Color = Color.FromArgb(teinte, teinte, teinte)
            Crayon.Width = 1
            e.Graphics.DrawRectangle(Crayon, 10, 10, 1, 1)
     
        End Sub
    Ce qui me fait penser que ça provient de l'évènement Form_Paint.
    Là ou ça coince c'est que mon code n'est pas dans un module de classe mais dans un Sub Main(). Comment faire pour que mon code fasse appel à cet évènement ?
    Si vous savez n'hésitez pas à me répondre.
    Salutations

  3. #3
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour horemheb

    Pour dessiner un point l'astuce c'est d'augmenter le Width du Pen et d'utiliser les Styles pointilles c.à.d Pen.DashStyle...

    code:
    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
     
    Public Class Form1
     
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            'evite le scintillemnt (flicker)
            Me.DoubleBuffered = True
            'redessine tout quand on resize le form
            Me.ResizeRedraw = True
     
        End Sub
     
        Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
            Dim gr As Graphics = e.Graphics
            gr.Clear(Color.White)
     
            'style point-point par defaut  DashDot
            Dim penDot As Pen = New Pen(Color.Black, 4.0)
            penDot.DashStyle = Drawing2D.DashStyle.DashDot
     
            Dim pt1 As Point = New Point(50, 50)
            Dim pt2 As Point = pt1
     
            For i = 1 To 1000
                gr.DrawLine(penDot, pt1, pt2)
                pt1 = pt2
                pt2.X = pt1.X + 10
                pt2.Y = pt1.Y + 10
     
            Next
     
            'ca n'empeche pas de change la couleur de pendot
            penDot.Color = Color.Red
            'peut etre personalise (un tableau de single ici 2 pour specifier un espace suivi d'un tiret -de longueur 0.5) 
            penDot.DashPattern = New Single(1) {1.0, 1.0}
     
            Dim pt3 As Point = New Point(100, 50)
            Dim pt4 As Point = pt3
     
            For i = 1 To 1000
                gr.DrawLine(penDot, pt3, pt4)
                pt3 = pt4
                pt4.X = pt3.X + 10
                pt4.Y = pt3.Y + 10
     
            Next
     
            'il faut disposer du pen(liberer la resource )
            penDot.Dispose()
        End Sub
    End Class
    bon code......

  4. #4
    Membre confirmé Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut
    Bonjour Mabrouki,
    Mon souci se situe au niveau de la gestion des modules : je m'explique :
    j'ai un module intitulé Principal avec Sub Main() qui démarre l'application, ouvre les fenêtres, gère le déplacement d'une PictureBox.
    Il lance des procédures déclarées dans un autre module intitulé Fourre-tout, parmi lesquelles des procédures de déplacement de la PictureBox.
    Cette PictureBox se déplace dans une fenêtre intitulée Fenetre_Ar définie par la classe Form2
    Je laisse une trace de ce déplacement dans le Graphic de la fenetre.
    L'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Crayon As New Pen(Color.Black, 1)
    placée au bon endroit dans le module Fourre-tout, aboutit au résultat recherché. Le déplacement de la PictureBox laisse une trace

    Je voudrais maintenant que la couleur de cette trace change au cours des évolutions de ma PictureBox.
    Après consultation de divers documents j'ai ajouté le code indiqué dans mon premier message pour faire varier la couleur du Pen. Or après divers tests, j'en ai déduit qu'il doit y avoir un lien entre l'instruction de changement de couleur du Pen dans mon module Fourre-tout et l'évènement Form_Paint du module de classe Form. Et là mes neurones me refusent toute assistance. Peux-tu me venir en aide ?
    Merci
    P.S. Pour le problème de tracé de point je verrai ensuite.

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bonjour,

    L'événement Paint est un événement généré par Windows lorsqu'une fenêtre a besoin d'être dessinée. C'est dans cet événement que tout dessin sur une forme doit être effectué. D'ailleurs l'événement fournit en argument une instance de la classe Graphics permettant de dessiner.
    Maintenant, rien ne vous empêche en dehors de cet événement d'effectuer le déplacement d'un control tel qu'une PictureBox. Toutefois, si vous désirez dessiner quelque chose manuellement (ligne, rectangle etc.), c'est toujours dans l'événement Paint que cela doit être effectué.

    J'espère avoir quelque peu éclairé vos neurones
    eb.

  6. #6
    Membre confirmé Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut
    Bonjour ebastien
    Je suis confus, après 36 tests et modifs, mon code fonctionne sans que je sache pourquoi il fonctionne maintenant alors qu'il ne fonctionnait pas précédemment.

    Quand vous dites :
    si vous désirez dessiner quelque chose manuellement (ligne, rectangle etc.), c'est toujours dans l'événement Paint que cela doit être effectué
    je pense qu'on peut le faire à l'extérieur de l'évènement Paint et que c'est le code qui se charge d'aller le chercher puisque mon code est conçu de cette façon; il n'y a rien dans l'évènement Paint.

    Mille excuses pour le dérangement.

  7. #7
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Il n'y a aucun dérangement, au contraire, ce type d'échange est bénéfique pour tout le monde !

    je pense qu'on peut le faire à l'extérieur de l'évènement Paint et que c'est le code qui se charge d'aller le chercher
    Comment votre code de dessin est-il appelé ? Quelque chose m'échappe. Il vous faut bien un objet System.Drawing.Graphics pour dessiner. Vous l'obtenez comment cet objet ? Par un Control.CreateGraphics ? Car a priori dans ce cas, le dessin est bien effectué mais, sauf erreur de ma part, non persistant. Je veux dire par là que si vous réduisez votre fenêtre et la ré-affichez, le dessin disparaît. Si ça marche, tant mieux mais j'aurais aimé comprendre.

    eb.

  8. #8
    Membre confirmé Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut
    Effectivement dans le Sub Main() je crée un Graphic à partir d'un Form_CreateGraphics.
    Quant à sa persistance je n'en sais rien puisque je ne touche pas à ma fenêtre (taille et position). Ca ne rentre pas dans les objectifs actuels de mon projet.

    D'un point de vue plus global ou plus conceptuel ça me paraît bizarre de devoir écrire son programme dans l'évènement Paint ou d'y implanter des "sous programmes". Comment, dans ce cas gérer des procédures qui font appel à des Forms de classes différentes, par exemple.
    Il me semble plus logique de se placer à l'extérieur des déclarations de classe et de trouver la bonne instruction qui va bien. Ce qui est plus facile à dire qu'à faire, j'en suis la preuve.
    Ne maîtrisant pas (de loin, de très loin) la complexité de VB, il se peut que je me plante complêtement. Il me faudra donc à ce moment-là revoir ma façon de concevoir un projet.

    Bonne journée

  9. #9
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Je comprends votre problématique. Toutefois, il ne s'agit aucunement d'écrire tout le programme dans l'événement Paint. C'est juste la logique dessin du control qui doit être implémenté dans cet événement. Cet événement étant géré par Windows. Si vous avez le temps de jouer un peu, vous pouvez tenter simplement d'écrire dans une nouvelle forme comportant 2 boutons (un pour le dessin et un autre pour le rafraîchissement de la fenêtre) :

    Code vb.net : 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
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim aGraphic = Me.CreateGraphics
            Try
                aGraphic.DrawLine(Pens.Black, New Point(5, 5), New Point(140, 150))
            Finally
                aGraphic.Dispose()
            End Try
        End Sub
     
        Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
            e.Graphics.DrawLine(Pens.Black, New Point(5, 5), New Point(100, 100))
        End Sub
     
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Me.Refresh()
        End Sub

    Les deux codes de dessin fonctionnent mais celui définit dans le paint de la forme est persistant étant appelé automatiquement lors d'une demande de rafraîchissement de la fenêtre par Windows (rafraîchissement forcé lors du click sur le bouton refresh). Quant à l'autre, il aura disparu...

    Maintenant, je ne connais pas votre architecture logiciel et loin de moi l'idée de tout remettre en cause...

    Bonne journée à vous

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 14/05/2004, 11h18
  2. [Forms] changer les couleurs
    Par Nounoursonne dans le forum Forms
    Réponses: 11
    Dernier message: 02/04/2004, 09h40
  3. [VB6]Changer la couleur d'une ligne d'un ListView
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 14/03/2003, 17h02
  4. Changer la couleur de fond de l'écran
    Par tnk dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 19/01/2003, 01h37
  5. Changer les couleurs de la palette avec du RGB
    Par le mage tophinus dans le forum x86 16-bits
    Réponses: 11
    Dernier message: 13/01/2003, 08h55

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