Clic de souris / marquage

gillesrun Messages postés 49 Date d'inscription vendredi 11 août 2006 Statut Membre Dernière intervention 26 juin 2007 - 21 juin 2007 à 07:03
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011 - 29 juin 2007 à 20:36
Bonjour,

Voila mon soucis:  j'ai plusieur label de taille differente et de couleur differente et je souhaiterais lorsque la  je clic sur un label avec la souris que celle çi laisse un point noir à l'endroit ou j'ai cliqué.

si quelqu'un peut m'aiguiller  pour bosser la dessus

merci d'avance

17 réponses

cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
21 juin 2007 à 08:03
Salut,

tu dois certainement utiliser l'evement click sur ce control (label) et dans le code de cette evenement tu traces un point. Je sais pas comment tracer un point sur un formulaire mais tu pourrais aussi changer la couleur de font (propriété Forecolor je crois) de ton label.

Je connais pas .net mais c'est le principe que je te donne.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
21 juin 2007 à 08:38
Bonjour,
Ce serait extrêmement facile sous VB6 en :
- considérant qu'un point n'est jamais rien d'autre qu'une droite d'une seule unité logique
- se servant le la grande facilité de VB6 de créer dynamiquement des groupes de contrôles indexés (des contrôles Line ici)
- se servant de l'événement mouseup (pour relever les coordonées) du label
- se servant du zorder pour l'appliquer au contrôle line ajouté dynamiquement

Je ne sais pas si VB.Net peut faire celà facilement (je crains que la chose ne soit plus complexe pour VB.Net du fait de l'absence réelle de groupes de contrôles indexés... et qu'il faille alors faire plus de travail)
0
gillesrun Messages postés 49 Date d'inscription vendredi 11 août 2006 Statut Membre Dernière intervention 26 juin 2007
21 juin 2007 à 08:41
c'est sympa de m'aider , mais une chose que j'ai oublié de dire , c'est que je suis debutant. Je prend note de ce que vous me dites , cela m'aidera un peu plus
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
21 juin 2007 à 08:46
Je ne peux malheureusement pas t'en dire plus, s'agissant d'une transposition éventuelle en VB.Net.
Je ne pourrais que t'écrire le code qui irait facilement avec VB6 !!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
21 juin 2007 à 13:44
alors alors :

tout d'abord :
Imports System.Drawing 'permet d'acceder a tte l'arborescense GDI+

deja il te faut créé une varialbe qui va retenir la position de ta souris :
private ptSouris as Point 'variable de classe

et dans l'event "mousemouve" de ton label :
ptSouris = new point(e.x, e.y)
ou
ptSouris.X = e.X
ptSouris.Y = e.Y

ca j'ai pas besoin d'expliquer (je l'espère)
ensuite tu a besoin de faire un point noir sur le label disont a TOUS les endroit ou tu a cliqué, pour ca on va donc créé une variable qui va les stocker en mémoire :
private lstPointClick as New List(Of Point) 'variable de classe
(ou si tu veux juste 1 seul point :)
private ptPointClick as Point 'variable de classe
 'variable de classe
private bExiste as boolean = False 'Le boolean existe car les "Point" sont des structure et existe directement a leur declaration

ensuite il faut mettre dans les variable les valeurs pour cela :
dans l'evenement "click" du label tu met :

* pour la liste :
lstPointClick.add(ptSouris)

*pour le poitn seul :
ptPointClick = ptSouris
bExiste = True

puis enfin il faut dessiner tout ca pour cela on utilise les methode graphique fournit pas .net => le GDI+ => system.drawing (et les namespace sous jacents)
les point dessiner sont ce qu'on pourrais appelé "éphémère" cad qu'il ne sont dessiner qu'une fois et apres si la zone est "invalider" (a redissiner en gros) il ne seront pas redessiner car ephemere pour cela il suffit simplement de les dessiner a chaque fois que le label est repeint donc on va dans l'evenement correspondant :
>"paint" du label :
on remarque que l'argrument "e" de type PaintEventArgs fournit un acces a un "e.graphics" qui est en realité l'objet graphic du label (l'objet de dessin) c'est sur lui que l'ont va dessiner le point :

dim grpLabel as Graphics = e.graphics 'je me trompe peut etre dans les nom exacte je fait ca de tete (ouvre msdn pour avoir les noms exacte)
ensuite il faut specifié comment tu va peindre, disont pour le moment avec une brosse => Brush <= de couleur "noir"
dim brStylo as New Brush(Color.Black)
puis il faut simplement dessinner l'objet de notre choix
je ne crois pas que l'ont puisse dessiner betement un point car un point est imaginaire cela dit tu peux par exemple dessiner une ellipse assez petite ou une crois enfin a toi de choisir comment representé reelement ton poitn je vais te montrer avec une cercle (ellispe particulière) plein de diametre 10 (c'est gros mais c'est juste un exemple)
grpLabel.FillElipse(brStylo, ptSouris.X - 5, ptSouris.Y -5, ptSouris.X + 5, ptSouris.Y + 5)

voila pour plus d'info regarde ce que fournit le namespace system.drawing
TeBeCo
0
gillesrun Messages postés 49 Date d'inscription vendredi 11 août 2006 Statut Membre Dernière intervention 26 juin 2007
21 juin 2007 à 14:59
ecoute , je crois qu'il vaut mieux que je te montre ce que cela donne ( avec quelque modification de debutant :)  )

Imports

System.Drawing
Public

Class Form1

Private lstPointClick
As
New List(
Of Point) 

Private ptSouris
As Point

Private bExiste
As
Boolean =
False 

 

Private
Sub Label1_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles Label1.ClicklstPointClick.Add(ptSouris)

End
Sub

Private
Sub Label1_MouseMove(
ByVal sender
As
Object,
ByVal e
As System.Windows.Forms.MouseEventArgs)
Handles Label1.MouseMove

Dim ptSouris
As PointptSouris =

New Point(e.X, e.Y)

End
Sub

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

Dim ptSouris
As Point

Dim pen
As
New Pen(Color.Black)

Dim g
As Graphics = e.Graphicsg.DrawEllipse(pen, ptSouris.X - 5, ptSouris.Y - 5, ptSouris.X + 5, ptSouris.Y + 5)

End
SubEnd

Class

voila.....mais ça ne marche pas  !!!
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
21 juin 2007 à 16:49
Salut,

Tu m'étonne que ça marche pas...

Tu ajoutes ptSouris à lstPointClick, mais sans jamais t'en servir. Autrement dit, t'as jolie liste ne sert à rien. Ensuite, que contient ptSouris à cette instant ? Bonne question... Certainement rien de bon car il n'a jamais été affecté (Tu as redéclaré ptSouris en local un peu de partout). Le bExist est inutilisé. Et finalement, pour le dessin, tu utilises encore une fois ptSouris en variable locale non affectée. Le tout à la dotnet : "beuh, y un garbage collector, alors j'instancie un objet par lignes, et je ne les libère jamais.".

Avec un seul point, ça ressemble plutôt à ça (Je n'ai jamais fait de vb.net) :
Public

Private ptSourisTemp
As Point

Private ptSouris
As Point

Private bExiste
AsBoolean =
False
 PrivateSub Label1_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles Label1.Click

lstPointClick.Add(ptSouris)

bExiste
=
True

' Je sais pas si ça va faire une copie ou pas
ptSouris
= ptSourisTemp

EndSubPrivateSub Label1_MouseMove(
ByVal sender
AsObject,
ByVal e
As System.Windows.Forms.MouseEventArgs)
Handles Label1.MouseMove
Dim ptSouris
As PointptSourisTemp
= New Point(e.X, e.Y)

EndSub

PrivateSub Label1_Paint(
ByVal sender
AsObject,
ByVal e
As System.Windows.Forms.PaintEventArgs)
HandlesLabel1.Paint

Dim pen
AsNew Pen(Color.Black)
if bExiste then e.Graphics
.DrawEllipse(pen, ptSouris.X - 5, ptSouris.Y - 5, ptSouris.X + 5, ptSouris.Y + 5)

EndSubEnd
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
21 juin 2007 à 16:52
Ca fait longtemps que j'avais pas écrit un truc aussi moche...

Erratum -> lstPointClick.Add(ptSouris) inutile et le private sub qui a pas changé de ligne...
0
gillesrun Messages postés 49 Date d'inscription vendredi 11 août 2006 Statut Membre Dernière intervention 26 juin 2007
21 juin 2007 à 17:03
sympa pour ton aide mais bon , ça marche pas plus !

gilles
0
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
21 juin 2007 à 18:33
j'ai fait ca a ma pause midi de tete sans doc ni IDE sous la main tu m'en vois dsl d'avoir fait un travail baclé sans que qqun esasye de lire un minimum la doc pour complementer ca ...
je testerai de mon coté plus tard pour en faire un code fonctionnel si j'ai le temps

TeBeCo
0
gillesrun Messages postés 49 Date d'inscription vendredi 11 août 2006 Statut Membre Dernière intervention 26 juin 2007
25 juin 2007 à 14:05
J'aurais trouvé ce bout de code qui pourrait coller mais le probleme est qu'il se base par rapport au point zero du formulaire c'est a dire le coin superieur gauche hors il faudrait qu'il se base au clic de la souris , au point où la souris a cliquée....si quelqu'un a une solution , ça m'aiderais bien

Private
Sub form_MouseClick(
ByVal sender
As
Object,
ByVal e
As System.Windows.Forms.MouseEventArgs)
Handles
Me.MouseClick
ptSourisTemp New Point(e.X, e.Y)ptSouris ptSourisTemp

Dim myPen
As
New System.Drawing.Pen(System.Drawing.Color.Black)

Dim labelGraphics
As System.Drawing.GraphicslabelGraphics =

Me.CreateGraphics()labelGraphics.DrawEllipse(myPen, ptSouris.X - 5, ptSouris.Y - 5, ptSouris.X + 5, ptSouris.Y + 5)

myPen.Dispose()

labelGraphics.Dispose()

End
Sub 

Private
Sub Form_MouseEvent(
ByVal sender
As
Object,
ByVal e
As System.Windows.Forms.MouseEventArgs)
Handles
MyBase.MouseDown, _

MyBase.MouseUp,
MyBase.MouseMove,
MyBase.MouseWheel
pixelColor Me.BackColorlblImage.Text

String.Format("Coordonnées dans le formulaire : X {0}, Y {1} ", _e.X, e.Y, pixelColor.A, pixelColor.R, pixelColor.G, pixelColor.B)

End
Sub

    gilles
0
gillesrun Messages postés 49 Date d'inscription vendredi 11 août 2006 Statut Membre Dernière intervention 26 juin 2007
28 juin 2007 à 07:28
personne pour me donner un coup de main ?? il n'y a pas une ame charitable ?  

gilles
0
gillesrun Messages postés 49 Date d'inscription vendredi 11 août 2006 Statut Membre Dernière intervention 26 juin 2007
28 juin 2007 à 11:04
bon ben voila le code exact qu'il me fallait !!!

 Dim labelGraphics As System.Drawing.Graphics
        labelGraphics = Me.CreateGraphics()
        Me.CreateGraphics.DrawEllipse(Drawing.Pens.Black, e.X - 3, e.Y - 3, 4, 4)

si ça peut servir a d'autre 

gilles
0
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
28 juin 2007 à 18:07
marrant mais je deconseille cette approche
fait passé une fenetre par dessus et reviens tu comprendra t'auras l'impression de passer la gomme de paint sur ton elipse

TeBeCo
0
gillesrun Messages postés 49 Date d'inscription vendredi 11 août 2006 Statut Membre Dernière intervention 26 juin 2007
29 juin 2007 à 07:07
Exact Tebeco, j'avais pas vu 
Mais il me semble que l'on peut parer ce probleme........je vais me renseigner et si je trouve , je rajouterais le bout de code içi

gilles
0
gillesrun Messages postés 49 Date d'inscription vendredi 11 août 2006 Statut Membre Dernière intervention 26 juin 2007
29 juin 2007 à 07:45
Tu avais raison Tebeco.........la fonction AutoRedraw ne fonctionne que sous vb.6 ( je vais d'ailleur finir par m'y mettre )

Bon , retour à la case depart........vite , un prozac 

gilles
0
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
29 juin 2007 à 20:36
comme je l'ai ecris plsu haut ... en lsiant on s'appercoit qu'il faut mettre le code dans l'evenement "paint" comme ca a chaque fois que le controle est redessiner on refait le jolie pti point ... c'est ca d'ailleur l'autoredraw
AutoRedraw = redissiner tout seul au bon moment
le seul bon moment c'est bel et bien l'event "Paint"
d'ou les variable de classe pour mémorisé le/les point ect ... enfin que de la logique :p
(t'aurais pu gagner 1 semaine mais du moment que ca marche je vais pas insister sur le fait de tout lire)

TeBeCo
0
Rejoignez-nous