[VB.NET 2010] Ajouter un élément sur une image dans une pictureBox [Résolu]

cs_bougyfab 10 Messages postés jeudi 16 novembre 2000Date d'inscription 22 juin 2011 Dernière intervention - 20 juin 2011 à 16:55 - Dernière réponse : cs_bougyfab 10 Messages postés jeudi 16 novembre 2000Date d'inscription 22 juin 2011 Dernière intervention
- 22 juin 2011 à 16:34
Bonjour a tous

J'essaie de développer un prog sous VB.

Or, j'aimerais savoir si, dans une PictureBox dans laquelle l'image est déjà chargé, on peut "rajouter" une autre image par dessus, ou insérer un symbole.


Concrètement:
J'ai un circuit électrique, qui apparaît dans ma pictureBox.

J'aimerais savoir si,d'un clic de l'utilisateur, je peux marquer une panne (par exemple, cercle ou croix rouge sur la zone du clic), un peu a l'image d'un Paint en fait.

Si oui, quelles sont les pistes a suivre?

Merci a tous
Afficher la suite 

Votre réponse

15 réponses

cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 20 juin 2011 à 18:04
+3
Utile
Salut
peut etre comme ça
sur la form j'ai un picture box
click gauche dessine un cercle rouge
click droit supprime le cercle

Private Sub PictureBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseClick
        If e.Button = Windows.Forms.MouseButtons.Left Then
            PictureBox1.Tag = "draw"
            Refresh()

        End If
        If e.Button = Windows.Forms.MouseButtons.Right Then
            PictureBox1.Tag = "not draw"
            Refresh()
        End If
    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        If PictureBox1.Tag = "draw" Then
            drawX(e.Graphics)
        End If

    End Sub
 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
       
        PictureBox1.Tag = "not draw"

    End Sub
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_ShayW
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 20 juin 2011 à 21:10
+3
Utile
J'ai oublié
voila j'ai un peu modifié

Public Class Form1
Dim flagshow As Boolean
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        flagshow = False
    End Sub

Private Sub PictureBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseClick
        If e.Button = Windows.Forms.MouseButtons.Left Then
            flagshow = True
            PictureBox1.Invalidate()

        End If
        If e.Button = Windows.Forms.MouseButtons.Right Then
            flagshow = False
            PictureBox1.Invalidate()
        End If
    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        If flagshow Then
            drawX(e.Graphics)
        End If

    End Sub
Private Sub drawCercle(ByVal GR As System.Drawing.Graphics)
        Dim mypen As New Pen(Color.Red, 2)
        GR.DrawArc(mypen, 0, 0, PictureBox1.Width - 2, PictureBox1.Height - 2, 0, 360)

    End Sub
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_ShayW
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 20 juin 2011 à 21:12
+3
Utile
plutot

Private Sub drawX(ByVal GR As System.Drawing.Graphics)
        Dim mypen As New Pen(Color.Red, 2)
        GR.DrawArc(mypen, 0, 0, PictureBox1.Width - 2, PictureBox1.Height - 2, 0, 360)

    End Sub
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_ShayW
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 22 juin 2011 à 09:38
+3
Utile
Salut
un peu plus compliqué
1 il faut conserver la position de la souris
dans une liste
2 avec une loop je dessine tous les cercles

Public Class Form1
    Private mousecoordinates As New List(Of Point)
    Private radius As Integer

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     radius = 40
End Sub 
Private Sub DrawCercles(ByVal GR As System.Drawing.Graphics)
        Dim mypen As New Pen(Color.Red, 2)
        For Each element In mousecoordinates
            GR.DrawArc(mypen, element.X - radius, element.Y - radius, 2 * radius, 2 * radius, 0, 360)
        Next
    End Sub

Private Sub PictureBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseClick
        If e.Button = Windows.Forms.MouseButtons.Left Then

            mousecoordinates.Add(New Point(e.X, e.Y))
            PictureBox1.Invalidate()

        End If
        
    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint

        DrawCercles(e.Graphics)


    End Sub
End Class  
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_ShayW
cs_bougyfab 10 Messages postés jeudi 16 novembre 2000Date d'inscription 22 juin 2011 Dernière intervention - 20 juin 2011 à 18:36
0
Utile
J'essaye ça et je te tiens au jus, mais ça m'a pas l'air mal...
En fait, je n'avais pas exploré toutes les parametres de PictureBox!!
Merci en tous cas.
Commenter la réponse de cs_bougyfab
cs_bougyfab 10 Messages postés jeudi 16 novembre 2000Date d'inscription 22 juin 2011 Dernière intervention - 20 juin 2011 à 18:42
0
Utile
Par contre, DrawX n'est pas reconnu (souligné en bleu)
il faut que j'importe une librairie particulière?
Commenter la réponse de cs_bougyfab
cs_bougyfab 10 Messages postés jeudi 16 novembre 2000Date d'inscription 22 juin 2011 Dernière intervention - 20 juin 2011 à 21:25
0
Utile
Ok je test ça demain
Merci
Commenter la réponse de cs_bougyfab
cs_bougyfab 10 Messages postés jeudi 16 novembre 2000Date d'inscription 22 juin 2011 Dernière intervention - 21 juin 2011 à 09:22
0
Utile
OK, c'est bien ce que je voulais, merci beaucoup. En plus, le code est pas trop dur a comprendre!!!! Et cela me permet de progresser davantage dans la compréhension du VB (notamment les évènements e.button, que je ne connaissait pas!)
Mais je ne peux créer qu'un seul cercle avec ça, non?

Mais je ne comprends pas le
Picture.Invalidated()
lors des evenements "clic souris gauche et droit"
a quoi sert-il?

Aussi, la taille du cercle prends toute ma pictureBox.
Je suppose qu'il faut modifier les paramètres de "mypen"

Private Sub drawX(ByVal GR As System.Drawing.Graphics)
Dim mypen As New Pen(Color.Red, 2)
GR.DrawArc(mypen, 0, 0,PictureBox1.Width - 2, PictureBox1.Height - 2, 0, 360)
End Sub

Je regarde sur VB pour voir comment parametre ça au mieux! (au pire, MSDN ou google!!)
Commenter la réponse de cs_bougyfab
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 21 juin 2011 à 12:56
0
Utile
Salut

en graphique il y a beaucoup à apprendre meme
moi je suis encore débutant

System.Drawing.Graphics c'est la class graphique
http://msdn.microsoft.com/fr-fr/library/system.drawing.graphics.aspx

bien sur tu peux dessiner plusieurs cercles
mais pour voir le dessin la sub qui dessine doit
etre appelé dans l'évenement paint
je prends l'exemple d'ici
tu veux dessiner un,des cercles dans le picturebox donc il faut appeler la sub qui dessine dans l'évenement paint du picturebox
en utilisant le parametre e

Picture.Invalidated()
pour permetre de produire l'évenement paint
si non la sub drawx ne sera pas executée

Dim mypen As New Pen(Color.Red, 2)
donne la couleur du crayon et son épaisseur

il doit surement y avoir des tutoriels sur
le sujet
Commenter la réponse de cs_ShayW
cs_bougyfab 10 Messages postés jeudi 16 novembre 2000Date d'inscription 22 juin 2011 Dernière intervention - 21 juin 2011 à 13:16
0
Utile
Merci de Pour toutes tes réponses et précisions!
Je comprends mieux, mais je chercherais un tuto quand même!!!!!
Ça me permettra d'apprendre encore!

en tout cas, SUJET RÉSOLU!!!!!

Merci encore
Commenter la réponse de cs_bougyfab
cs_bougyfab 10 Messages postés jeudi 16 novembre 2000Date d'inscription 22 juin 2011 Dernière intervention - 21 juin 2011 à 18:03
0
Utile
je reviens un peu sur les arguments spécifique de DrawArc:

j'ai bidouillé un peu les paramètre de DrawArc de la manière suivante:
GR.DrawArc(mypen, 0, 0, 20, 20, 0, 360)


J'ai bien compris que
Mypen: dessine avec "mypen" défini juste au dessus comme PEN
0: valeur x du centre de l'arc
0: valeur y du centre de l'arc
20: rayon x de l'arc
20: rayon y de l'arc
0: début de la mesure d'angle
360: fin de la mesure d'angle

Mais j'aimerais définir les valeurs x,y centre de l'arc comme la position du clic de la souris.
J'ai trouvé l’évènement MousePosition suivant, qui renvoie les coordonnées code=vb] GR.DrawArc(mypen, MousePosition, 20, 20, 0, 360)/code
Mais ça ne fonctionne pas. Une piste a suivre?
peut-être récupérer dans des variable les valeur x,y lors d'un évènement clic souris, et introduire ces variables comme paramètres?
genre
Sub CoordonéeSouris etc..Handle Mouse.Clic (ou un truc du genre)
Dim XClic as single
Dim YClic as single

MousePositionX = XClic
MousePositionY = YClic


et renvoyer ces variable comme paramètres DrawArc

Je ne sais pas si c'est bien clair, mais j'espère que l'on pourra m'aider!!
(Surtout ShayW, qui a l'air de bien connaitre les fonctions DrawArc!!!)
Commenter la réponse de cs_bougyfab
cs_bougyfab 10 Messages postés jeudi 16 novembre 2000Date d'inscription 22 juin 2011 Dernière intervention - 21 juin 2011 à 18:15
0
Utile
PPPPPFFFFFFFFFFFFFFFFFF
BOULET INSIDE!!!!!!!

il suffit de passer l'arguments MousePosition.X et MousePosition.Y en lieu et place des coordonnées...
tel que
 GR.DrawArc(mypen, MousePosition.X, MousePosition.Y, 20, 20, 0, 360)



par contre, je n'ai pas saisie la méthode pour générer plusieurs cercles.
en effet, lorsque je clique plusieurs fois avec le clic droit, cela efface le cercle déjà présent et le remplace par un autre.

pour info
Public Class SchemaFuite
    Dim flagshow As Boolean
    Private Sub SchemaFuite_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        flagshow = False
        MsgBox("un clic sur le bouton droit pour marquer la fuite" & vbCr &
               "un clic sur le bouton gauche pour effacer", 48,
               "Veuillez cliquer l'endroit où les fuites ont été détectées")
        If TA0501.PSE True And TA0501.RBT_Cabine1.Enabled True Then
            'TODO: arriver a afficher les images d'après les ressource
            'affiche le chemin pour le schéma de la clim cabine Sud-Est
        ElseIf TA0501.PSE True And TA0501.RBT_FroidDomestique.Enabled True Then
            '" le schéma du froid domestique sud-est
        ElseIf TA0501.PSE True And TA0501.RBT_Remoque.Enabled True Then
            '" le schéma de la clim remorque
        ElseIf TA0501.DUP True And TA0501.RBT_Cabine1.Enabled True Then
            '" le schéma de la clim cabine duplex/Res
        ElseIf TA0501.DUP True And TA0501.RBT_FroidDomestique.Enabled True Then
            '" le schéma du froid domestique duplex
        ElseIf TA0501.PLT True And TA0501.RBT_Cabine1.Enabled True Then
            '" le schéma de la clim cabine duplex/Res
        ElseIf TA0501.PLT True And TA0501.RBT_FroidDomestique.Enabled True Then
            '" le schéma du froid domestique
        ElseIf TA0501.PLT True And TA0501.RBT_Remoque.Enabled True Then
            '"le schéma de la clim remorque
        End If

        PictureBox1.Load()

    End Sub

    Private Sub PictureBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseClick
        If e.Button = Windows.Forms.MouseButtons.Left Then
            flagshow = True
            PictureBox1.Invalidate()
        End If

        If e.Button = Windows.Forms.MouseButtons.Right Then
            flagshow = False
            PictureBox1.Invalidate()
        End If
    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        If flagshow Then
            drawX(e.Graphics)
        End If
    End Sub

    Private Sub drawX(ByVal GR As System.Drawing.Graphics)
        Dim mypen As New Pen(Color.Red, 2)
        GR.DrawArc(mypen, MousePosition.X, MousePosition.Y, 20, 20, 0, 360)

    End Sub
End Class
Commenter la réponse de cs_bougyfab
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 21 juin 2011 à 22:47
0
Utile
tout d'abord tu n'as dit ce que tu voulais faire
à part dessiner un cercle
de quel grandeur ? à quel emplacement

GR.DrawArc(mypen, 0, 0, 20, 20, 0, 360)
l'arc est inscrit dans un rectangle
et ceux sont les parametres du rectangle utilisés
dans la méthode drawarc
les deux 0 le coin gauche supérieur du rectangle
si j'écris 30,30
ton rectangle est placé 30 pixels à droite
à partir de l'extremité gauche de ta picturebox
et aussi 30 pixels vers le bas
20 la largeur du rectangle
20 la hauteur du rectangle
0 à partir d'où l'arc commence
0 correspond à 3h sur l'horloge analogique
360 le nombre de degré ajouté à l'angle de départ
positif dans le sans des aiguilles de la montre

donc par ex si j'écris
0 ,90 dessine un quart de cercle entre 3h et 6h
si j'écris 90 ,-90 j'obtiens le meme résultat
je dessine un arc qui débute de 90 (6h sur la montre) et j'ajoute -90 donc je reviens vers 3 h

si j'ai GR.DrawArc(mypen, 10, 10, 20, 20, 0, 360)
et c'est la picturebox
______________________ la picturebox
| 10
| 10____20__l___ le carré
| | l'arc est inscris dans le carré
| 20

le clic droit c'est seulement dans le cas ou
tu veux effacer le cercle
mais peut etre explique ce que l'application
doit faire pour cela avant de coder il faut savoir ce qu'on doit faire
Commenter la réponse de cs_ShayW
cs_bougyfab 10 Messages postés jeudi 16 novembre 2000Date d'inscription 22 juin 2011 Dernière intervention - 22 juin 2011 à 04:04
0
Utile
Naaan je me suis trompé:
Quand je clic plusieurs fois avec le clic gauche, pas le clic droit!
Donc un clic gauche me crée un cercle, un clic droit l'efface.
Mais si je fais:
1 clic gauche -> apparition du cercle
1 clic gauche -> disparition du 1er cercle et apparition d'un autre cercle.

Moi, ce que je voudrais, c'est :
1 clic gauche -> apparition du cercle )la ou j'ai cliqué)
1 -> clic gauche-> apparition d'un deuxième cercle la oú j'ai cliqué
Etc...

Sinon, pour l'histoire des paramètres, j'ai consulté un message que tu avais déjà posté auparavant sur le forum, et j'avais bien compris l'histoire des angles etc...

Sinon, la fonction de l'application, et bien c'est s'entourer une ou plusieurs pannes sur un schéma. (entre autre!!! La partie schéma n'est qu'un module de mon appli!)

Voilà voilà! Excuse moi, je me suis mal si je me suis mal expliqué!!! Et surtout merci de ton aide.
Commenter la réponse de cs_bougyfab
cs_bougyfab 10 Messages postés jeudi 16 novembre 2000Date d'inscription 22 juin 2011 Dernière intervention - 22 juin 2011 à 16:34
0
Utile
Mille fois merci.
C'est exactement ce que je voulais!!!!!
J'ai bien compris la méthode que tu as utilisé, et j'ai bien compris le code en lui même ( a part l'histoire de la variable radius: a quoi sert-elle: a ne pas avoir de décalage avec les coordonnées du clic?)

Mais je t'avoue que j'étais loin d'écrire un code comme ça.

Je commençais a réfléchir à l'ajout d'un objet image (en l’occurrence un cercle) à chaque clic (ce qui est aussi possible!, C'est génial le VB: une problématique et plein de solutions!!!Après, il faut choisir la meilleure!!!!)

En tou cas, je te remercie beaucoup pour ton aide et surtout d'avoir pris le temps de rédiger le code:
1 ça me permets d'avancer dans mon projet
2 ça me permets d'apprendre plus facilement
3 un bout de code est souvent plus explicite que de longues explications

Pour tout te dire, je ne m'attendais pas à ce que tu me balance du code comme ça!!!

Merci encore!!!!
Commenter la réponse de cs_bougyfab

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.