gillesrun
Messages postés49Date d'inscriptionvendredi 11 août 2006StatutMembreDernière intervention26 juin 2007
-
21 juin 2007 à 07:03
TeBeCo
Messages postés467Date d'inscriptionlundi 24 juin 2002StatutMembreDerniè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
cs_Nicko11
Messages postés1141Date d'inscriptionmercredi 7 mars 2007StatutMembreDernière intervention19 septembre 20073 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.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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)
gillesrun
Messages postés49Date d'inscriptionvendredi 11 août 2006StatutMembreDernière intervention26 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
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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 !!!
Vous n’avez pas trouvé la réponse que vous recherchez ?
TeBeCo
Messages postés467Date d'inscriptionlundi 24 juin 2002StatutMembreDerniè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
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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)
TeBeCo
Messages postés467Date d'inscriptionlundi 24 juin 2002StatutMembreDerniè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
gillesrun
Messages postés49Date d'inscriptionvendredi 11 août 2006StatutMembreDernière intervention26 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 =
TeBeCo
Messages postés467Date d'inscriptionlundi 24 juin 2002StatutMembreDerniè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
gillesrun
Messages postés49Date d'inscriptionvendredi 11 août 2006StatutMembreDernière intervention26 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
TeBeCo
Messages postés467Date d'inscriptionlundi 24 juin 2002StatutMembreDerniè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)