oui , il peut y avoir jusqu'a 30 ronds sur un label mais bon , c'est vraiment un cas extreme.
oui , il peut y avoir jusqu'a 30 ronds sur un label mais bon , c'est vraiment un cas extreme.
alors dans ce cas là je te propose de recréer un label perso
ensuite tu génère ton projet et tu devrais avoir un nouveau composant dans la boite à outils nommé cible
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 public class Cible inherits system.windows.forms.Label private _Impacts as new microsoft.visualbasic.collection sur mouse clic: dim PT as new system.Drawing.point (e.x,e.y) _Impacts.add PT dessiner point comme tu le faisais avant sur evenement me.paint: for each PT as system.drawing.point in _Impacts dessiner point avec PT.x et PT.y au lieu de e.x et e.y next
et tu poses des cibles au lieu de label et ta feuille ne doit donc plus contenir le code qui gère les cercles car l'objet cible les gere tout seul et le redessine tout seul
ok , je vais essayer et je te tiens au courant.............merci pour l'aide !!!
gilles
bon , voila le code que ça donne ( si le debutant que je suis n'a pas merdé ):
mais quand je genere, et que je veux passer en mode concepteur ben là il est ecrit : " pour ajouter des composants a votre classe, faites les glisser dans la boite a outil et utiliser la fenetre propriété pour definir leur proprieté. Pour creer des methodesv et des evenements pour votre classe, cliquez içi pour passer en mode code "
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 Option Strict Off Option Explicit On Imports System.IO Imports System.Timers Public Class Cible Inherits System.Windows.Forms.Label Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick Dim _Impacts As New Microsoft.VisualBasic.Collection Dim PT As New System.Drawing.Point(e.X, e.Y) _Impacts.Add(PT) Dim labelGraphics As System.Drawing.Graphics labelGraphics = Me.CreateGraphics() Me.CreateGraphics.DrawEllipse(Drawing.Pens.Black, e.X - 3, e.Y - 3, 4, 4) End Sub Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint Dim _Impacts As New Microsoft.VisualBasic.Collection For Each PT As System.Drawing.Point In _Impacts Dim labelGraphics As System.Drawing.Graphics labelGraphics = Me.CreateGraphics() Me.CreateGraphics.DrawEllipse(Drawing.Pens.Black, PT.X - 3, PT.Y - 3, 4, 4) Next End Sub End Class
Chose qui est bien , c'est que la creation de nouveau element est pris en compte !
Dit , si mon programme marche et que je suis oblihgé de creer une multinationale pour le vendre , je t'offre 0,01 % des benefices ( ha le pingre )
gilles
alors deja, option strict off c'est interdit, surtout pour les debutants
donc option strict on !
ca oblige à déclarer les variables et ca vérifie ton code pour éviter les bugs
sinon quand tu mets du code, mets la balise du code du forum pour qu'il fasse la mise en forme
[ code] et [ / code] sans les espaces
ce qui donne ca :
et donc là on voit que ton code ne va pas du tout
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 Option Strict Off Option Explicit On Imports System.IO Imports System.Timers Public Class Cible Inherits System.Windows.Forms.Label Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick Dim _Impacts As New Microsoft.VisualBasic.Collection Dim PT As New System.Drawing.Point(e.X, e.Y) _Impacts.Add(PT) Dim labelGraphics As System.Drawing.Graphics labelGraphics = Me.CreateGraphics() Me.CreateGraphics.DrawEllipse(Drawing.Pens.Black, e.X - 3, e.Y - 3, 4, 4) End Sub Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint Dim _Impacts As New Microsoft.VisualBasic.Collection For Each PT As System.Drawing.Point In _Impacts Dim labelGraphics As System.Drawing.Graphics labelGraphics = Me.CreateGraphics() Me.CreateGraphics.DrawEllipse(Drawing.Pens.Black, PT.X - 3, PT.Y - 3, 4, 4) Next End Sub End Class
ensuite quand tu dim une variable, elle a une portée définie
dans une classe :
private = dim = la classe connait la variable
protected = la classe et ses enfants (suite à héritage) connaissent la variable
friend = visible par tout le projet mais pas les projets d'a coté, des fois un exe est composé de plusieurs projets via des dll par exemple
public = tout le monde peut y avoir accès, meme de très loin (autre feuille etc...)
dans une sub:
dim = seule la sub ou fonction connait la variable
static = la variable existe que dans la sub mais garde sa valeur entre 2 passages
et toi tu as 2 sub ou tu definis la collection
à la fin de la sub la variable se vide et est détruite
alors que moi je t'avais dit de la mettre en private
cette classe doit etre dans un fichier à part de celui de ta feuille
dans ton projet tu fais ajouter élèment puis classe
tu mets le code dedans
l'icone va changer et si tu double clic sur ta classe tu auras encore le message qu'il n'y a pas de visuel et que tu peux rajouter des composants
mais n'en rajoute pas c'est normal
et ensuite tu génère le projet et sur ta feuille tu regarde dans la barre d'outils
sinon tes subs qui s'appellent Form1_MouseClick t'es plus dans ta feuille
et me désigne ton objet Cible actuel
et maintenant je veux 0,02 % !
ok , tout a marcher , le controle cible est bien crée mais bon , tout s'efface toujours quand je met la fenetre en reduit .
Je te donne 0,01 % mais tu peux prendre le yacht un week end sur deux
redonne le nouveau code
et t'as supprimé les labels de ta feuille pour poser des cibles à la place ?
voila le code de la class :
et oui , j'ai virer les labels
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 Public Class Cible Inherits System.Windows.Forms.Label Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick Dim _Impacts As New Microsoft.VisualBasic.Collection Dim PT As New System.Drawing.Point(e.X, e.Y) _Impacts.Add(PT) Dim labelGraphics As System.Drawing.Graphics labelGraphics = Me.CreateGraphics() Me.CreateGraphics.DrawEllipse(Drawing.Pens.Black, e.X - 3, e.Y - 3, 4, 4) End Sub Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint Dim _Impacts As New Microsoft.VisualBasic.Collection For Each PT As System.Drawing.Point In _Impacts Dim labelGraphics As System.Drawing.Graphics labelGraphics = Me.CreateGraphics() Me.CreateGraphics.DrawEllipse(Drawing.Pens.Black, PT.X - 3, PT.Y - 3, 4, 4) Next End Sub End Class
Dans le paint, si tu fais ça :
Tu réinitialises la collection à chaque fois. Donc c'est normal, que tu perdes les points.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Dim _Impacts As New Microsoft.VisualBasic.Collection
euh gilles t'abuses
j'ai ecrit un pavé c'est pas pour rien alors tu le lis stp !!! (et tu le comprends aussi sinon on va pas avancer)
bon , apres une pause et suite à l'enguelade du chef sperot ( ), j'ai mis en private ce que tu m'a dit , c'est a dire en debut de class ( enfin si j'ai bien compris !)
donc , voila ce que ça donne.....
gilles
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Public Class Cible Inherits System.Windows.Forms.Label Private _Impacts As New Microsoft.VisualBasic.Collection Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick Dim PT As New System.Drawing.Point(e.X, e.Y) _Impacts.Add(PT) Dim labelGraphics As System.Drawing.Graphics labelGraphics = Me.CreateGraphics() Me.CreateGraphics.DrawEllipse(Drawing.Pens.Black, e.X - 3, e.Y - 3, 4, 4) End Sub Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint For Each PT As System.Drawing.Point In _Impacts Dim labelGraphics As System.Drawing.Graphics labelGraphics = Me.CreateGraphics() Me.CreateGraphics.DrawEllipse(Drawing.Pens.Black, PT.X - 3, PT.Y - 3, 4, 4) Next End Sub End Class
alors là tu te fous de moi
je t'ai dit 5 trucs à corriger et y a encore plein de conneries !
les balises code c'est entre crochet qu'il faut les mettre et sans point
e.x - 3 je t'ai expliqué pourquoi c'était pas bon
et dim labelgraphics sert à rien je te l'ai dit aussi !!!
et il faut comprendre pourquoi private sur la collection !
le but de ce code c'est qu'à chaque fois que l'utilisateur clic, tu dessines un point et tu enregistre ce point (tu le mets dans une collection)
une collection est un groupe d'objet, l'avantage c'est qu'on peut dire de faire une chose sur tout un groupe
ensuite sur l'evenement paint (qui est déclenché quand ta fenetre se réaffiche)
tu redessine tous les points que tu as mis dans la collection
en faisant dim collection dans une sub, elle est vidée en sortant de la sub donc pour retrouver les points dans la sub d'à coté ca peut pas aller !
j'ai expliqué precedement les types de déclaration et leur portée
edit : histoire de changer les "modos" me "courent après" pour mon ton que je qualifierais d'expressif
et j'ajoute qu'il ne faut pas le prendre mal, c'est juste pour donner un peu de refief, je suis là pour aider (ce que je fais) et comme le ferais un prof, je hausse le ton quand l'élève n'est pas à fond dedans
oula , j'ai les oreilles qui sifflent.........mais t'as finis de me crier dessus ????
Bon , pour les dim labelgraphics, je les avais virer mais je t'ai copier le mauvais code, e.x - 3 pareil , c'est devenue e.x - 2.... a nouveau le code mais si tu as envie de gueuler maintenant , crie dans le langage des signes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 Public Class Cible Inherits System.Windows.Forms.Label Private _Impacts As New Microsoft.VisualBasic.Collection Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick Dim PT As New System.Drawing.Point(e.X, e.Y) _Impacts.Add(PT) Me.CreateGraphics.DrawEllipse(Drawing.Pens.Black, e.X - 2, e.Y - 2, 4, 4) End Sub Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint For Each PT As System.Drawing.Point In _Impacts Me.CreateGraphics.DrawEllipse(Drawing.Pens.Black, PT.X - 2, PT.Y - 2, 4, 4) Next End Sub End Class
gilles
Dans l'événement click, ce n'est pas la peine de dessiner le point, tu devrais plutot demander à la fenêtre de se rafraichir avec un Invalidate() par exemple. Car de toute façon, tu vas redessiner ce point quand tu passeras dans l'événement paint.
EDIT : Et d'ailleurs pourquoi ne pas utiliser une collection typée de points plutôt qu'une collection générique; ça serait plus joli avec un List<System.Drawing.Point> non ?
Je vais essayer car pour l'instant, quand je diminue ma fenetre, ben tout s'efface quand meme. Je vais voir pour la methode invalidate()
Merci du conseil
Envoyé par SaumonAgile
je pense que le invalidate est un peu violent, surtout quand on voit les performances graphiques du framework ...
et pour la collection typée en effet c'est mieux mais vu que c'est débutant je pense qu'une collection normale est mieux pour apprendre à quoi ca sert et comment ca fonctionne
Salut sperot, j'ai rajouté " me.invalidate " dans la partie paint pour essayer , ça fonctionne, les points reapparaissent mais en clignotant , version sapin de noel !!
J'ai essayé aussi avec la methode " refresh " pareil que pour invalidate mais bon , ça clignote moins !!
C'est parce que la plupart du temps, la méthode est mal utilisée.Envoyé par sperot51
Invalidate sans argument invalide toute la fenêtre, il existe des surcharges de la méthode qui prennent en paramètre des regions ou des rectangles pour spécifier la région à redessiner. Dans le cas présent il suffit de passer en paramètre la région du label.
Apres 3 tubes d'aspirine et pas mal d'injure ( ), j'ai reussit à creer une region sous forme de rectangle mais bon , la methode invalidate clignote toujours à la reouverture de la fenetre ..........
je met le code et le premier qui rigole , ben.....heu........heu ,enfin voilà
gilles
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Public Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint For Each PT As System.Drawing.Point In _Impacts Me.CreateGraphics.DrawEllipse(Drawing.Pens.Black, PT.X - 2, PT.Y - 2, 4, 4) Dim bloc As New Rectangle(0, 0, 492, 447) e.Graphics.DrawRectangle(Pens.Black, bloc) Invalidate(bloc) Next End Sub
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager