{VB 2005}Tracer un trait [Résolu]

Signaler
Messages postés
255
Date d'inscription
jeudi 29 juillet 2004
Statut
Membre
Dernière intervention
2 avril 2010
-
Messages postés
255
Date d'inscription
jeudi 29 juillet 2004
Statut
Membre
Dernière intervention
2 avril 2010
-
Salut à tous,

Comment tracer un trait entre 2 controles créés dynamiquement. Les 2 sont choisis dans un listbox.
Je n'arrive pas à récupérer les coordonnées des controles dont le nom est choisi.

Merci de votre aide.

Swan94

8 réponses

Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
30
Bon voilà un example bien complet :
(A coller dans une nouveau projet et un fichier code vide)



Option

Explicit

On

Option

Strict

On

Imports
System

Imports
System.Windows.Forms

Imports
System.Drawing

Public

Class
FormCtrl

  
Inherits
System.Windows.Forms.Form

#
Region

" Initialisation "

  
Private
BtnAdd
As

New
System.Windows.Forms.Button()

  
Private
BtnSelectControl
As

New
System.Windows.Forms.Button()

  
Public

Sub

New
()

    System.Windows.Forms.Application.EnableVisualStyles()

    
Call
InitializeComponent()

  
End

Sub

  
Protected

Overrides

Sub
Finalize()

    
MyBase
.Dispose(
True
)

    
MyBase
.Finalize()

  
End

Sub

  
Private

Sub
InitializeComponent()

    
' BtnAdd

    
Me
.BtnAdd.Location =
New
System.Drawing.Point(0, 0)

    
Me
.BtnAdd.Size =
New
System.Drawing.Size(115, 23)

    
Me
.BtnAdd.Text =
"Ajouter un controle"

    
AddHandler

Me
.BtnAdd.Click,
AddressOf
OnControlAdd

    
' BtnAdd

    
Me
.BtnSelectControl.Location =
New
System.Drawing.Point(
Me
.BtnAdd.Right, 0)

    
Me
.BtnSelectControl.Size =
New
System.Drawing.Size(145, 23)

    
Me
.BtnSelectControl.Text =
"Selectionner deux controls"

    
AddHandler

Me
.BtnSelectControl.Click,
AddressOf
OnSelectControl

    
'Base

    
MyBase
.ClientSize =
New
System.Drawing.Size(640, 480)

    
MyBase
.Controls.AddRange(
New
System.Windows.Forms.Control() {
Me
.BtnAdd,
Me
.BtnSelectControl})

    
AddHandler

MyBase
.Paint,
AddressOf
OnDrawFormPaint

  
End

Sub

#
End

Region

  
Private
CtrlList
As

New
System.Collections.Generic.List(
Of
System.Windows.Forms.Control)

  
Private
SelectControl1
As
System.Windows.Forms.Control

  
Private
SelectControl2
As
System.Windows.Forms.Control

  
Private

Sub
OnControlAdd(
ByVal
Sender
As

Object
,
ByVal
Args
As
System.EventArgs)

    
Dim
Rnd
As

New
System.Random()

    
Dim
CtrlToAdd
As
System.Windows.Forms.Control

    
Select

Case
Rnd.Next(0, 4)
' Choisi un controle aleatoire

      
Case

Is 0 : CtrlToAdd
New
System.Windows.Forms.Button()

      
Case

Is 1 : CtrlToAdd
New
System.Windows.Forms.CheckBox()

      
Case

Is 2 : CtrlToAdd
New
System.Windows.Forms.TextBox()

      
Case

Is 3 : CtrlToAdd
New
System.Windows.Forms.RadioButton()

      
Case

Is 4 : CtrlToAdd
New
System.Windows.Forms.ComboBox()

    
End

Select

    
If
CtrlToAdd
IsNot

Nothing

Then

      CtrlToAdd.Location =
New
System.Drawing.Point(Rnd.Next(0,
MyBase
.ClientSize.Width - CtrlToAdd.Width), Rnd.Next(26,
MyBase
.ClientSize.Height - CtrlToAdd.Height))

      CtrlToAdd.Text =
String
.Format(
"1 {0}."
, CtrlToAdd.GetType().Name)

      
MyBase
.Controls.Add(CtrlToAdd)

      
AddHandler
CtrlToAdd.MouseDown,
AddressOf
OnCtrlMouseDown

      
AddHandler
CtrlToAdd.MouseMove,
AddressOf
OnCtrlMouseMove

      CtrlList.Add(CtrlToAdd)

    
End

If

  
End

Sub

  
Dim
DeltaMove
As
System.Drawing.Point

  
Private

Sub
OnCtrlMouseDown(
ByVal
Sender
As

Object
,
ByVal
Args
As
System.Windows.Forms.MouseEventArgs)

    DeltaMove = Args.Location

  
End

Sub

  
Private

Sub
OnCtrlMouseMove(
ByVal
Sender
As

Object
,
ByVal
Args
As
System.Windows.Forms.MouseEventArgs)

    
If
Args.Button = System.Windows.Forms.MouseButtons.Left
Then

      
Dim
Ctrl
As
System.Windows.Forms.Control =
CType
(Sender, System.Windows.Forms.Control)

      
Dim
DrawLink
As

Boolean
=
CBool
((SelectControl1
IsNot

Nothing

AndAlso
SelectControl2
IsNot

Nothing
)
AndAlso
(Ctrl.Equals(SelectControl1)
Or
Ctrl.Equals(SelectControl2)))

      
If
DrawLink
Then
DrawLinkControl(
MyBase
.CreateGraphics(),
New
System.Drawing.Pen(
MyBase
.BackColor))

      Ctrl.Left += (Args.Location.X - DeltaMove.X)

      Ctrl.Top += (Args.Location.Y - DeltaMove.Y)

      
If
DrawLink
Then
DrawLinkControl(
MyBase
.CreateGraphics(), System.Drawing.Pens.Red)

    
End

If

  
End

Sub

  
Private

Sub
OnSelectControl(
ByVal
Sender
As

Object
,
ByVal
Args
As
System.EventArgs)

    
Dim
FrmSelect
As

New
FormSelectCtrl()

    FrmSelect.ListCtrl1.Items.AddRange(CtrlList.ToArray())

    FrmSelect.ListCtrl2.Items.AddRange(CtrlList.ToArray())

    FrmSelect.ListCtrl1.SelectedItem = SelectControl1

    FrmSelect.ListCtrl2.SelectedItem = SelectControl2

    FrmSelect.ShowDialog()

    SelectControl1 =
CType
(FrmSelect.ListCtrl1.SelectedItem, System.Windows.Forms.Control)

    SelectControl2 =
CType
(FrmSelect.ListCtrl2.SelectedItem, System.Windows.Forms.Control)

    FrmSelect.Dispose()

    
MyBase
.Invalidate()

  
End

Sub

  
Private

Sub
OnDrawFormPaint(
ByVal
Sender
As

Object
,
ByVal
Args
As
System.Windows.Forms.PaintEventArgs)

    
Call
DrawLinkControl(Args.Graphics, System.Drawing.Pens.Red)

  
End

Sub

  
Private

Sub
DrawLinkControl(
ByVal
Graphics
As
System.Drawing.Graphics,
ByVal
Pen
As
System.Drawing.Pen)

    
If
SelectControl1
IsNot

Nothing

AndAlso
SelectControl2
IsNot

Nothing

Then

      Graphics.DrawLine(Pen, SelectControl1.Location, SelectControl2.Location)

    
End

If

  
End

Sub

End

Class

Public

Class
FormSelectCtrl

  
Inherits
System.Windows.Forms.Form

#
Region

" Initialisation "

  
Friend
ListCtrl1
As

New
System.Windows.Forms.ListBox()

  
Friend
ListCtrl2
As

New
System.Windows.Forms.ListBox()

  
Public

Sub

New
()

    System.Windows.Forms.Application.EnableVisualStyles()

    
Call
InitializeComponent()

  
End

Sub

  
Protected

Overrides

Sub
Finalize()

    
MyBase
.Dispose(
True
)

    
MyBase
.Finalize()

  
End

Sub

  
Private

Sub
InitializeComponent()

    
' ListCtrl1

    
Me
.ListCtrl1.Location =
New
System.Drawing.Point(0, 0)

    
Me
.ListCtrl1.Size =
New
System.Drawing.Size(
MyBase
.ClientSize.Width, 120)

    
Me
.ListCtrl1.DisplayMember =
"Text"

    
' ListCtrl2

    
Me
.ListCtrl2.Location =
New
System.Drawing.Point(0,
Me
.ListCtrl1.Bottom)

    
Me
.ListCtrl2.Size =
New
System.Drawing.Size(
MyBase
.ClientSize.Width, 120)

    
Me
.ListCtrl2.DisplayMember =
"Text"

    
'Base

    
MyBase
.Controls.AddRange(
New
System.Windows.Forms.Control() {
Me
.ListCtrl1,
Me
.ListCtrl2})

  
End

Sub

#
End

Region

End

Class





Kenji
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
6
Salut,
Dans l'évènement paint de ton form, tu peux mettre

e.Graphics.DrawLine(LePenDeTonChoix , control1.Left + control1.Width / 2, control1.Top + control1.Height / 2, control2.Left + control2.width / 2, control2.Top + control2.Height / 2)

Je suis pas sur mon pc et je t'écris l'instruction de mémoire mais je pense que c'est bien ca

Bonne prog

Julien.
Messages postés
2237
Date d'inscription
lundi 29 mai 2006
Statut
Membre
Dernière intervention
29 mai 2008
6
Salut! j'ai testé ce que a dit julien237 pour lui, ça marche mais il faut convertir les dimensions en single parce que la fonction n'accepte pas les double et les integer!

Imports Systeme.Drawing

Private
Sub Form1_Paint(
ByVal sender
As
Object,
ByVal e
As System.Windows.Forms.PaintEventArgs)
Handles
Me.Painte.Graphics.DrawLine(Pens.AliceBlue,

CSng(CmdAnalyser.Left + CmdAnalyser.Width / 2), _

CSng(CmdAnalyser.Top + CmdAnalyser.Height / 2),
CSng(CmdResultat.Left + CmdResultat.Width / 2), _

CSng(CmdResultat.Top + CmdResultat.Height / 2))

End
Sub

 Drikce 06
Messages postés
255
Date d'inscription
jeudi 29 juillet 2004
Statut
Membre
Dernière intervention
2 avril 2010

Merci de vos réponses mais je n'arrive pas à lui faire comprendre que le nom choisi dans le listbox correspopnd à un controle.

Swan94
Messages postés
2237
Date d'inscription
lundi 29 mai 2006
Statut
Membre
Dernière intervention
29 mai 2008
6
Ah! Tu choisis dans un listbox le nom des controles! Il y avait eu un post pour mettre des contrôles en variable mais c'était en VBA, ça peut marcher aussi en VB 2005 je pense, faudrait rechercher le post mais j'ai pas le temps maintenant!

 Drikce 06
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
30
Salut,




Tu peux utiliser ca :





Dim
ControlChoisi
As
System.Windows.Forms.Control = LeConteneurDeTesControls.Controls(TaListBox.SelectedItem.ToString())



Kenji
Messages postés
255
Date d'inscription
jeudi 29 juillet 2004
Statut
Membre
Dernière intervention
2 avril 2010

salut et merci à tous,
et merci à toi Charles Racaud d'être souvent là lors de mes problèmes.

Je vous explique mon problème avec ces controles :
Je créé des controles dynamiquement sur la form1
Lorsque j'ouvre la form3 les controles de la form1 sont listés dans un listbox
Après avoir choisi les 2 controles à relier sur le listbox, je voudrait créer le trait entre les 2 controles sur la Form1.

Merci de m'aider.

Swan94
Messages postés
255
Date d'inscription
jeudi 29 juillet 2004
Statut
Membre
Dernière intervention
2 avril 2010

Merci de votre aide et surtout toi Charles qui encore une fois m'a fourni un code complet et clair.

Swan94