Clic de souris / marquage

Signaler
Messages postés
49
Date d'inscription
vendredi 11 août 2006
Statut
Membre
Dernière intervention
26 juin 2007
-
Messages postés
467
Date d'inscription
lundi 24 juin 2002
Statut
Membre
Dernière intervention
9 mars 2011
-
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

Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
3
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.
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
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)
Messages postés
49
Date d'inscription
vendredi 11 août 2006
Statut
Membre
Dernière intervention
26 juin 2007

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
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
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 !!!
Messages postés
467
Date d'inscription
lundi 24 juin 2002
Statut
Membre
Dernière intervention
9 mars 2011

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
Messages postés
49
Date d'inscription
vendredi 11 août 2006
Statut
Membre
Dernière intervention
26 juin 2007

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  !!!
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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...
Messages postés
49
Date d'inscription
vendredi 11 août 2006
Statut
Membre
Dernière intervention
26 juin 2007

sympa pour ton aide mais bon , ça marche pas plus !

gilles
Messages postés
467
Date d'inscription
lundi 24 juin 2002
Statut
Membre
Dernière intervention
9 mars 2011

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
Messages postés
49
Date d'inscription
vendredi 11 août 2006
Statut
Membre
Dernière intervention
26 juin 2007

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
Messages postés
49
Date d'inscription
vendredi 11 août 2006
Statut
Membre
Dernière intervention
26 juin 2007

personne pour me donner un coup de main ?? il n'y a pas une ame charitable ?  

gilles
Messages postés
49
Date d'inscription
vendredi 11 août 2006
Statut
Membre
Dernière intervention
26 juin 2007

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
Messages postés
467
Date d'inscription
lundi 24 juin 2002
Statut
Membre
Dernière intervention
9 mars 2011

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
Messages postés
49
Date d'inscription
vendredi 11 août 2006
Statut
Membre
Dernière intervention
26 juin 2007

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
Messages postés
49
Date d'inscription
vendredi 11 août 2006
Statut
Membre
Dernière intervention
26 juin 2007

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
Messages postés
467
Date d'inscription
lundi 24 juin 2002
Statut
Membre
Dernière intervention
9 mars 2011

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