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 :

tracer une ligne comme dans Word ou PowerPoint sur une PictureBox


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut tracer une ligne comme dans Word ou PowerPoint sur une PictureBox
    Salut,

    Pour un projet d'école, je désire réaliser un logiciel. J'ai commencé à apprendre la programmation avec VB 2010, mais je suis encore qu'une débutante.

    Bref, une partie de mon logiciel consiste à tracer une ligne comme dans Word ou PowerPoint sur une PictureBox. Donc, je voudrais faire comme dans cette vidéo (
    ), mais avec MouseDown et MouseUp pour déterminer les coordonnées.

    Des pistes ?

    Merci à l'avance!

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Août 2009
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 147
    Points : 174
    Points
    174
    Par défaut
    Hello,

    tu peux récupérer la position de la souris par la propriété MousePosition.
    Il te reste plus qu'à créer des variables dans lesquels tu stockes MousePosition.X et MousPosition.Y dans le évenements MouseDown et MouseUp avant de les utiliser dans le drawLine.

  3. #3
    Membre régulier
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Points : 77
    Points
    77
    Par défaut
    Bonjour,

    Je me greffe sur cette discussion concernant mouseposition.X et mouseposition.Y dont je me sers dans mon application.

    J'ai l'impression que mouseposition prend en compte la position sur l'écran et non sur le formulaire. J'aimerais pourtant avoir la position sur mon formulaire avec une corrélation avec les position Left et Top de ce dernier.

    Merci beaucoup pour votre aide.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Août 2009
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 147
    Points : 174
    Points
    174
    Par défaut
    Ben, tu accède aux coordonnée de ton formulaire avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Parent.Location.X  ...
    et tu fais la soustraction pour avoir tes coordonnées par rapport à celui-ci et non à l'écran.

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    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 175
    Points : 25 116
    Points
    25 116
    Par défaut
    ou sinon control.pointtoclient()

    à noter qu'il faut dessiner dans l'évènement paint du control
    donc il faut stocker quelques parts la(les) ligne(s) à dessiner pour pouvoir le refaire à chaque rafraichissement

  6. #6
    Membre régulier
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Points : 77
    Points
    77
    Par défaut
    merci pour vos réponses

    Citation Envoyé par Pol63 Voir le message
    ou sinon control.pointtoclient()

    à noter qu'il faut dessiner dans l'évènement paint du control
    donc il faut stocker quelques parts la(les) ligne(s) à dessiner pour pouvoir le refaire à chaque rafraichissement
    si c'est à moi que ça s'adresse, ça ne me concerne pas, j'essaye juste de permettre à l'utilisateur de déplacer un bouton et donc le positionner là où la souris s'est arrêtée (MouseUp). C'est pourquoi je comptais utiliser MousePosition. Mais je vais essayer vos trucs.

    Merci

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 673
    Points : 1 175
    Points
    1 175
    Par défaut
    Bonjour,
    a tester sur la surface d'un Picturebox :
    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
        Dim ptA As Point
     
        Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
            '*** Pour éventuellement nettoyer la vue.
            PictureBox1.Image = Nothing
            '*** récupère le point de départ de ligne.
            ptA = New Point(e.X, e.Y)
        End Sub
     
        Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
            '*** Récupère le point de fin de ligne.
            Dim ptB As Point = New Point(e.X, e.Y)
            ' Récupère l'objet Graphics correspondant à la surface du contrôle.
            Dim gr As Graphics = Me.PictureBox1.CreateGraphics
            ' Dessine la ligne selon les points en mémoire.
            gr.DrawLine(Pens.Red, ptA, ptB)
            gr.Dispose()
        End Sub

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    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 175
    Points : 25 116
    Points
    25 116
    Par défaut
    Citation Envoyé par chrismonoye Voir le message
    (...)
    sauf que ca va s'effacer ...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Points : 390
    Points
    390
    Par défaut
    Bonjour,

    Citation Envoyé par jpg75014
    J'aimerais pourtant avoir la position sur mon formulaire avec une corrélation avec les position Left et Top de ce dernier.
    En utilisant (et il le faut) pointtoclient comme indiqué par Pol63 vous allez obtenir les coordonnées relativement à la zone client d'une fenêtre, non pas par rapport à la fenêtre elle même. La zone client exclu la bordure et la barre de titre. Le left top que vous indiquez est relatif à la position de la fenêtre complète sur l'écran ou le conteneur MDI.

    Pour la question initiale et de façon à ce que tout cela ne s'efface pas, et puisque nous sommes dans un langage objet il faut penser objet. Donc créer une classe, qui aura des propriétés comme X1, X2 etc qui stockeront les position en mouse_down et mouse_up et une fonction dessine.

    D'autre part si vous souhaitez faire un véritable outil de tracer de ligne vous allez être confronté à un pb insoluble (à ma connaissance ) en .Net GDI+ c'est celui de la gestion des raster op (mode XOR). En effet pour dessiner une ligne entre mouse_down (on stocke le pt de départ) et le mouse_up (on stocke le pt final) il y a le mouse_move où là normalement on dessine une ligne qui va du pt de départ à la position actuelle. En fait on dessine une ligne en mode XOR qui va du pt de départ à la position précédente et une ligne du pt de départ à la position courante. La solution que j'ai adoptée et l'utilisation des API32 qui elles permettent de gérer les rasterop.

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    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 175
    Points : 25 116
    Points
    25 116
    Par défaut
    Citation Envoyé par Geo2A Voir le message
    D'autre part si vous souhaitez faire un véritable outil de tracer de ligne vous allez être confronté à un pb insoluble (à ma connaissance ) en .Net GDI+ c'est celui de la gestion des raster op (mode XOR). En effet pour dessiner une ligne entre mouse_down (on stocke le pt de départ) et le mouse_up (on stocke le pt final) il y a le mouse_move où là normalement on dessine une ligne qui va du pt de départ à la position actuelle. En fait on dessine une ligne en mode XOR qui va du pt de départ à la position précédente et une ligne du pt de départ à la position courante. La solution que j'ai adoptée et l'utilisation des API32 qui elles permettent de gérer les rasterop.

    je ne comprends pas trop ton histoire de rasterop, et google ne veut pas trop m'aider, mais il y a les bufferedgraphics qui permettent de faire pas mal de choses (comme de l'undo ou du déplacement de ligne, ou tout ce que fait paint je pense)

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Merci!
    Merci beaucoup pour toutes vos réponses. J'ai essayé celle de chrismonoye et ça fonctionne à merveille!


  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Points : 390
    Points
    390
    Par défaut
    Bonsoir,

    je ne comprends pas trop ton histoire de rasterop
    Le rasterop c'est la façon dont les pixels se combinent pour former une image. Le mode classique par défaut et AND un pixel Bleu AND un pixel Rouge égale un pixel Noir : (255,0,0) AND (0,0,255) = (0,0,0) (je passe sous silence la conversion d'une valeur BGR en entier).

    Le mode XOR (ou exclusif) permet de tracer une ligne par exemple (0,0 ; 20,20) en rouge, puis si on trace la même ligne toujours en mode XOR cela restitue le fond d'origine car une ligne rouge XOR la même ligne = invariance (fond d'origine).
    C'est cette techno qui est utilisée pour dessiner un cadre de sélection avec la souris.

    Pour google :

    http://www.leptonica.com/rasterops.html

    Et une esquisse de solution avec GDI+ (en C#) que je n'aime pas.

    http://support.microsoft.com/kb/314945/fr

    A+

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut L'épaisseur du trait
    Citation Envoyé par chrismonoye Voir le message
    Bonjour,
    a tester sur la surface d'un Picturebox :
    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
        Dim ptA As Point
    
        Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
            '*** Pour éventuellement nettoyer la vue.
            PictureBox1.Image = Nothing
            '*** récupère le point de départ de ligne.
            ptA = New Point(e.X, e.Y)
        End Sub
    
        Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
            '*** Récupère le point de fin de ligne.
            Dim ptB As Point = New Point(e.X, e.Y)
            ' Récupère l'objet Graphics correspondant à la surface du contrôle.
            Dim gr As Graphics = Me.PictureBox1.CreateGraphics
            ' Dessine la ligne selon les points en mémoire.
            gr.DrawLine(Pens.Red, ptA, ptB)
            gr.Dispose()
        End Sub
    Merci encore! Ça marche vraiment bien!

    Je voulais savoir maintenant comment modifier l'épaisseur du trait sur un Pens. J'ai essayé les méthodes pour Pen, mais ça marche pas. Comment devrais-je l'écrire dans ce programme.

  14. #14
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    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 175
    Points : 25 116
    Points
    25 116
    Par défaut
    pens.red est une instance de pen fournit par microsoft, tu peux en instancier un pour le définir comme tu veux

    dim p as pen

    et ensuite lui donner sa couleur, son épaisseur, si tu veux des pointillés etc...

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut L'épaisseur du trait
    Je suis aller voir dans msdn et j'ai fait comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim pinceau As Pen
        pinceau.Width = 2.0F
    Mais ça me dit «Déclaration attendue» alors que j'ai déjà un Dim.

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Problème de l'épaisseur du pinceau résolu
    J'ai trouvé la réponse à mon problème. Je dois écrire Dim pinceau As Pen dans Private Sub et non dans Public Class.

  17. #17
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    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 175
    Points : 25 116
    Points
    25 116
    Par défaut
    tu peux le mettre dans le sub, c'est surtout qu'il faut un new
    enfin ce qu'il faudrait plus c'est lire ca : http://plasserre.developpez.com/cours/vb-net/

  18. #18
    Futur Membre du Club
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Bonjour, je reviens sur :

    '*** Pour éventuellement nettoyer la vue.
    PictureBox1.Image = Nothing


    Tout en gardant une image

    '*** Pour éventuellement nettoyer la vue.
    PictureBox1.refresh

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

Discussions similaires

  1. [Toutes versions] Positionnement sur une ligne précise dans un formulaire
    Par Didier L dans le forum Contribuez
    Réponses: 3
    Dernier message: 28/10/2015, 13h21
  2. Accès SQL dans fichier excel erreur sur une ligne
    Par troubleshooting dans le forum Excel
    Réponses: 3
    Dernier message: 17/11/2009, 14h46
  3. Recherche dans Grid et focus sur une ligne dans grid
    Par angelevil dans le forum Windows Forms
    Réponses: 1
    Dernier message: 29/05/2009, 00h37
  4. Réponses: 11
    Dernier message: 26/08/2007, 14h07
  5. Réponses: 1
    Dernier message: 19/12/2006, 16h12

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