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

Windows Forms Discussion :

Graphique dans PictureBox


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Par défaut Graphique dans PictureBox
    Bonjour,

    avec le code suivant je veux tout betement tracer une ligne dans une PictureBox, soit en style "Solid" avec le bouton1, soit en style "pointille" avec le bouton2.
    Je veux egalement que ce graphique soit persistant meme si il est recouvert momentanement par une autre fenetre par exemple. C'est pourquoi j'utilise 'Invalidate' qui, si j'ai bien compris, force le retracage du controle vise.

    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
    Imports System.Drawing
    Public Class Form1
      Dim Crayon As Pen = New Pen(Color.Black)
      Public g As Graphics
      Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        g = Graphics.FromHwnd(Me.PictureBox1.Handle)
      End Sub
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Crayon.DashStyle = Drawing2D.DashStyle.Solid
        PictureBox1.Invalidate()
      End Sub
      Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Crayon.DashStyle = Drawing2D.DashStyle.Dot
        PictureBox1.Invalidate()
      End Sub
      Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint, Me.Paint
        g.DrawLine(Crayon, 10, 10, 100, 100)
      End Sub
    End Class
    Il y a 2 choses que je ne comprends pas :

    1/ Je suis oblige d'ajouter 'Me.Paint' dans les Handles de l'evenement PictureBox1_Paint pour voir ma ligne, du coup celle ci est tracee des le demarrage de la feuille ce que je ne veux pas et je pensais que le Handle PictureBox1.Paint suffisait mais visiblement non, pourquoi ?

    2/ Si je clique sur le bouton 1 ou 2, ma ligne est effacee mais n'est pas retracee tant que le curseur de souris est au dessus du bouton sur lequel je viens de cliquer. Pqreil, si jappuis sur la touche 'Entree' quand un bouton a le focus, je dois ensuite taper Tabulation pour donner le focus a l'autre bouton pour que la ligne soit tracee, la encore : pourquoi et y a t'il un moyen de corriger ce probleme ?

    Merci par avance pour votre aide.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 240
    Par défaut
    A ta place j'oublierais l'evenement Paint (je ne vois pas trop a quoi il sert en l'occurence...)
    J'ai testé ce code, ca marche impec ...

    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
    Imports System.Drawing
    Public Class Form1
        Public Sub Trait(ByVal Style As Drawing2D.DashStyle)
            Dim Crayon As Pen = New Pen(Color.Black)
            Crayon.DashStyle = Style
            Dim g As Graphics = PictureBox1.CreateGraphics
            g.Clear(PictureBox1.BackColor)
            g.DrawLine(Crayon, 10, 10, 100, 100)
            g.Flush()
            Crayon.Dispose()
            g.Dispose()
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Trait(Drawing2D.DashStyle.Solid)
        End Sub
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Trait(Drawing2D.DashStyle.Dot)
        End Sub
    End Class

  3. #3
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    Poses-toi la question :
    A quel moment l'évenement Paint du composant PictureBox est-il provoqué ?
    Cela répondra à toutes tes questions.

    La solution que propose Totanne n'est pas tout à fait correct car le dessin s'efface si la picturebox est couverte.

    La solution est de passer par une image.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.PictureBox1.Image = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
    End Sub


    Ensuite la méthode de Totanne peut s'appliquer sauf que dans la procédure "Trait" tu vas chercher le graphics de ton image

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Sub Trait(ByVal Style As Drawing2D.DashStyle)
     ...
     Dim g As Graphics = Graphics.FromImage(PictureBox1.Image)
      ...
    End Sub
    

  4. #4
    Membre Expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Par défaut
    Bonjour,

    merci de vos reponses meme si elles ne repondent pas directement a mes questions Je ne peux pas tester de suite vos reponses car ma machine equipee en VB2008 n'est pas celle ci mais je copie vos codes.

    Si je voulais passer par l'evenement Paint c'est parce que j'avais vu dans MSDN que c'etait le moyen le plus simple pour rendre une image persistante ce qui est essentiel pour moi. C'est donc pour appeler l'evenement Paint que j'utilisais Invalidate (la aussi trouve dans MSDN) et justement je me suis pose la question de savoir quand mon controle Picture serait redessine Je pensais qu'il le serait en utilisant Invalidate qui me semble etre la pour ca, mais visiblement la reponse n'est qu'un "oui" partiel puisque le bouton qui "appelle" ce Invalidate doit perdre le focus et la justement ca depasse mes competences.
    Le but du jeu pour moi est de tracer une courbe de donnees en temps reel et je me vois mal convertir mon graphique en image a chaque acquisition, celle ci se faisant a au moins 10 hertz.
    Venant de VB6, j'avoue etre totalement decontenance par la logique de DotNet et par la perte de fonctions VB6 que je trouvais bien utiles. J'ai du boulot avant de comprendre le binz.

  5. #5
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    Citation Envoyé par OhMonBato Voir le message
    Le but du jeu pour moi est de tracer une courbe de donnees en temps reel et je me vois mal convertir mon graphique en image a chaque acquisition, celle ci se faisant a au moins 10 hertz.
    L'image tu ne la créé qu'une seule fois dans le load de ton Form, au lieu de dessiner sur le picturebox, tu dessines sur l'image, c'est cela qui va permettre de garder un dessin persistant... pas besoin d'invalidate ...

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 240
    Par défaut
    Tout a fait d'accord avec Kelpan
    Je travaille toujours sur une pictureBox via une image mais j'avais cru comprendre sur un autre post (mise à l'echelle d'une image) que OhMonBato répugnait à les utiliser.
    Je ne m'était pas trompé

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

Discussions similaires

  1. [VB6] Copie graphique excel dans picturebox (problème)
    Par Xerath dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 10/01/2008, 15h47
  2. [C#] Capture écran dans pictureBox
    Par Gauden dans le forum Windows Forms
    Réponses: 5
    Dernier message: 05/05/2004, 10h18
  3. [VB6] [Graphisme] Inversion dans picturebox
    Par tomnie dans le forum VB 6 et antérieur
    Réponses: 23
    Dernier message: 16/04/2003, 15h05
  4. Réponses: 3
    Dernier message: 09/02/2003, 01h09
  5. Réponses: 10
    Dernier message: 27/08/2002, 23h24

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