ligne avec bouton droit

Le
John-Pet
Bonjours à toutes et tous

1>une picturebox ou une image
2>un point de coordonnées connues dans cette picturebox ou image

je voudrais avoir une ligne d'affichée entre le point connu et le
curseur de la souris, mais qui bouge avec le deplacement de la souris
lorsque j'appui sur le bouton droit
quand je relache ce bouton la ligne doit se figer dans la picturebox

merci

JP

--
Adresse mail : john-pet@wanadoo.fr
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-marc
Le #15409071
John-Pet wrote:
Bonjours à toutes et tous

1>une picturebox ou une image
2>un point de coordonnées connues dans cette picturebox ou image

je voudrais avoir une ligne d'affichée entre le point connu et le
curseur de la souris, mais qui bouge avec le deplacement de la souris
lorsque j'appui sur le bouton droit
quand je relache ce bouton la ligne doit se figer dans la picturebox



Hello,
tout simple:
mets une picturebox (picture1) sur une form

puis ceci:

Option Explicit

Const MOUSE_RIGHT As Integer = 2

' les coordonnées du point connu
Dim xc As Single, yc As Single

Private Sub Form_Load()
' init du point connu, disons au centre
' du picture box
xc = Picture1.Width / 2
yc = Picture1.Height / 2
End Sub


Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As
Single, Y As Single)

If Button = MOUSE_RIGHT Then
' efface la picturebox
Picture1.Cls
Picture1.Line (xc, yc)-(X, Y)
End If
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As
Single, Y As Single)
If Button = MOUSE_RIGHT Then
' efface la picturebox
Picture1.Cls
Picture1.Line (xc, yc)-(X, Y)
End If
End Sub


Pas plus dur que ça :-)


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Jean-marc
Le #15409061
Jean-marc wrote:
John-Pet wrote:
Bonjours à toutes et tous

1>une picturebox ou une image
2>un point de coordonnées connues dans cette picturebox ou image

je voudrais avoir une ligne d'affichée entre le point connu et le
curseur de la souris, mais qui bouge avec le deplacement de la souris
lorsque j'appui sur le bouton droit
quand je relache ce bouton la ligne doit se figer dans la picturebox





Une version encore plus courte, pour le fun :

Option Explicit

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
Call Picture1_MouseMove(Button, Shift, X, Y)
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, _
X As Single, Y As Single)

Static xc As Single, yc As Single
If (xc = 0) And (yc = 0) Then xc = Picture1.Width / 2: yc =
Picture1.Height / 2
If Button = 2 Then
Picture1.Cls: Picture1.Line (xc, yc)-(X, Y)
End If
End Sub


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
John-Pet
Le #15409051
un grand merci pour tes réponses Jean Marc

je vais encore te soliciter
1> peut on faire la même chose sur une image
2> garder la ligne tracée pour en faire une deuxième

j'ai aussi remarqué, lorsque tu passes sur une autre fenetre et que tu
reviens par la suite sur la picturebox la ligne n'est plus là

JP


Jean-marc avait soumis l'idée :
John-Pet wrote:
Bonjours à toutes et tous

1>une picturebox ou une image
2>un point de coordonnées connues dans cette picturebox ou image

je voudrais avoir une ligne d'affichée entre le point connu et le
curseur de la souris, mais qui bouge avec le deplacement de la souris
lorsque j'appui sur le bouton droit
quand je relache ce bouton la ligne doit se figer dans la picturebox



Hello,
tout simple:
mets une picturebox (picture1) sur une form

puis ceci:

Option Explicit

Const MOUSE_RIGHT As Integer = 2

' les coordonnées du point connu
Dim xc As Single, yc As Single

Private Sub Form_Load()
' init du point connu, disons au centre
' du picture box
xc = Picture1.Width / 2
yc = Picture1.Height / 2
End Sub


Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As
Single, Y As Single)

If Button = MOUSE_RIGHT Then
' efface la picturebox
Picture1.Cls
Picture1.Line (xc, yc)-(X, Y)
End If
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As
Single, Y As Single)
If Button = MOUSE_RIGHT Then
' efface la picturebox
Picture1.Cls
Picture1.Line (xc, yc)-(X, Y)
End If
End Sub


Pas plus dur que ça :-)



--
Adresse mail :
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
Jean-marc
Le #15409031
> John-Pet wrote:
un grand merci pour tes réponses Jean Marc



Avec plaisir !

je vais encore te soliciter
1> peut on faire la même chose sur une image



Non, car une image ne possède pas de propriété line

2> garder la ligne tracée pour en faire une deuxième



On peut, mais c'est plus compliqué. en gros on stocke les lines
dans un tableau de lines.
Voir code à la fin.


j'ai aussi remarqué, lorsque tu passes sur une autre fenetre et que tu
reviens par la suite sur la picturebox la ligne n'est plus là



Pour ça il suffit de mettre la propriété AutoRedraw de ta form
et de ta picture à "True".

'------------
' voici le code pour garder plusieurs lignes
'

Option Explicit

Private Const MAX_LINES As Long = 1000

Private Type aPoint
X As Single
Y As Single
End Type

Private Type aLine
a As aPoint
b As aPoint
End Type

Dim the_lines(MAX_LINES) As aLine
Dim nb_lines As Long
Dim xc As Single, yc As Single

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
Call Picture1_MouseMove(Button, Shift, X, Y)
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
If (xc = 0) And (yc = 0) Then
xc = Picture1.Width / 2: yc = Picture1.Height / 2
End If

If Button = 2 Then
Picture1.Cls:
Picture1.Line (xc, yc)-(X, Y)
redraw_all
End If
End Sub

Public Sub redraw_all()
Dim i As Long

For i = 1 To nb_lines
Picture1.Line (the_lines(i).a.X,
the_lines(i).a.Y)-(the_lines(i).b.X, the_lines(i).b.Y)
Next i

End Sub

Private Sub Picture1_MouseUp(Button As Integer, _
Shift As Integer, _
X As Single, Y As Single)
If Button = 2 Then
nb_lines = nb_lines + 1
the_lines(nb_lines).a.X = xc
the_lines(nb_lines).a.Y = yc
the_lines(nb_lines).b.X = X
the_lines(nb_lines).b.Y = Y
End If
End Sub

' ------------------------------------------

Et voila :-)

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
John-Pet
Le #15408991
Ok , à moi d'adapter ma picturebox, car je ne connais pas d'avance la
taille du graphisme que je vais mettre dedans, cela change toujours
avec une image j'ai pas ce probleme

si je veux ne plus faire partir ma ligne d'un point fixe mais par
rapport au clic de la souris comment signaler ce point de départ

Merci

JP


Dans son message précédent, Jean-marc a écrit :
John-Pet wrote:
un grand merci pour tes réponses Jean Marc



Avec plaisir !

je vais encore te soliciter
1> peut on faire la même chose sur une image



Non, car une image ne possède pas de propriété line

2> garder la ligne tracée pour en faire une deuxième



On peut, mais c'est plus compliqué. en gros on stocke les lines
dans un tableau de lines.
Voir code à la fin.


j'ai aussi remarqué, lorsque tu passes sur une autre fenetre et que tu
reviens par la suite sur la picturebox la ligne n'est plus là



Pour ça il suffit de mettre la propriété AutoRedraw de ta form
et de ta picture à "True".

'------------
' voici le code pour garder plusieurs lignes
'

Option Explicit

Private Const MAX_LINES As Long = 1000

Private Type aPoint
X As Single
Y As Single
End Type

Private Type aLine
a As aPoint
b As aPoint
End Type

Dim the_lines(MAX_LINES) As aLine
Dim nb_lines As Long
Dim xc As Single, yc As Single

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
Call Picture1_MouseMove(Button, Shift, X, Y)
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
If (xc = 0) And (yc = 0) Then
xc = Picture1.Width / 2: yc = Picture1.Height / 2
End If

If Button = 2 Then
Picture1.Cls:
Picture1.Line (xc, yc)-(X, Y)
redraw_all
End If
End Sub

Public Sub redraw_all()
Dim i As Long

For i = 1 To nb_lines
Picture1.Line (the_lines(i).a.X, the_lines(i).a.Y)-(the_lines(i).b.X,
the_lines(i).b.Y)
Next i

End Sub

Private Sub Picture1_MouseUp(Button As Integer, _
Shift As Integer, _
X As Single, Y As Single)
If Button = 2 Then
nb_lines = nb_lines + 1
the_lines(nb_lines).a.X = xc
the_lines(nb_lines).a.Y = yc
the_lines(nb_lines).b.X = X
the_lines(nb_lines).b.Y = Y
End If
End Sub

' ------------------------------------------

Et voila :-)



--
Adresse mail :
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
Jean-marc
Le #15408981
John-Pet wrote:
Ok , à moi d'adapter ma picturebox, car je ne connais pas d'avance la
taille du graphisme que je vais mettre dedans, cela change toujours
avec une image j'ai pas ce probleme

si je veux ne plus faire partir ma ligne d'un point fixe mais par
rapport au clic de la souris comment signaler ce point de départ



Et bien en lisant le code c'est supposé être évident.
Le point de départ est xc, yc.
Dans le code que j'avais donné, on calculait xc et yc comme
étant le centre du Picture.
Si on veut que le point de départ soit les coordonnées de la souris,
il suffit d'affecter xc et yc à respectivement X et Y lors du click.
Donc dans Picture1.MousEDown:

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
xc = X: yc = Y
Call Picture1_MouseMove(Button, Shift, X, Y)
End Sub

Et dans MousMove, on supprime le calcul, donc on supprime ces lignes:
'If (xc = 0) And (yc = 0) Then
' xc = Picture1.Width / 2: yc = Picture1.Height / 2
'End If


Voila :-)


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
LE TROLL
Le #15408941
Tiens, testé, en 17 lignes (picturebox1) avec clique gauche maintenu de
n'importe où = départ, et lâcher = fin


Dim x0 As Single, y0 As Single
Dim clique As Boolean

Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y
As Single)
If Button <> 1 Then Exit Sub
Picture1.Cls
x0 = X
y0 = Y
clique = True
End Sub

Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y
As Single)
If clique <> True Then Exit Sub
Picture1.Cls
Picture1.Line (x0, y0)-(X, Y)
End Sub

Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As
Single)
clique = False
End Sub



--
Merci beaucoup, au revoir et à bientôt :o)
------
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"John-Pet"
Bonjours à toutes et tous

1>une picturebox ou une image
2>un point de coordonnées connues dans cette picturebox ou image

je voudrais avoir une ligne d'affichée entre le point connu et le curseur
de la souris, mais qui bouge avec le deplacement de la souris lorsque
j'appui sur le bouton droit
quand je relache ce bouton la ligne doit se figer dans la picturebox

merci

JP

--
Adresse mail :
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net




Fred
Le #15408931
Dans : news:463d7343$0$13857$,
Jean-marc disait :

Salut Jean-Marc,

Je saute dans le fil au passage, je serai peut-être à côté de la plaque
...

Pour tracer une ligne «mobile» sur un dessin existant, j'utilisais le
mode XOR.

Ainsi, il suffit de retracer la dernière ligne affichée pour qu'elle
s'efface en restituant ce qu'elle recouvrait.


--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
Jean-marc
Le #15408921
Fred wrote:
Dans : news:463d7343$0$13857$,
Jean-marc disait :

Salut Jean-Marc,

Je saute dans le fil au passage, je serai peut-être à côté de la
plaque ...

Pour tracer une ligne «mobile» sur un dessin existant, j'utilisais le
mode XOR.

Ainsi, il suffit de retracer la dernière ligne affichée pour qu'elle
s'efface en restituant ce qu'elle recouvrait.



Hello Fred,

C'est effectivement la solution la plus appropriée pour ce
type de cas, tu as tout à fait raison.

J'ai essayé de donner des solutions "simples" pour ne pas
"effrayer" John qui semble être un débutant dans le
domaine.

Peux être as tu un petit bout de code exemple montrant
l'utilisation de XOR ?

Bien cordialement,

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Fred
Le #15408911
Dans : news:463d8402$0$14239$,
Jean-marc disait :

Hello Fred,



Peux être as tu un petit bout de code exemple montrant
l'utilisation de XOR ?



Hélas, non, c'étais dans une vie antérieure !!
Et je n'ai pas vb6 ici pour tester. Mais je donne le principe en
fonction de ce que demande John-Pet.
(en recopiant ton code)

Dim xOrig As Single
Dim yOrig As Single

'Mémorisation de la dernière ligne tracée
Dim xPrec As Single
Dim yPrec as Single

'Mémorisation du DrawMode
Dim dm As Integer

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
xOrig = X : yOrig = Y
xPrec = X : yPrec = Y
dm = Picture1.DrawMode
Picture1.DrawMode = ????
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As
Single, Y As Single)
If Button = MOUSE_RIGHT Then
' efface la ligne précédente
Picture1.Line (xOrig, yOrig)-(xPrec, yPrec)
'trace la nouvelle ligne
Picture1.Line (xOrig, yOrig)-(X, Y)
'mémorise la ligne
xPrec = X
yPrec = Y
End If
End Sub

Ceci fonctionne si le DrawMode est positionné correctement mais je ne me
souviens pas de la constante qui produit le meilleur résultat (une des
constantes Xor)

Il faudrait ajouter la gestion du MouseUp dans laquelle :
On restitue de DrawMode initial
On retrace de manière définitive la dernière ligne.

Peux-tu complèter pour moi ?



--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
Publicité
Poster une réponse
Anonyme