{VB 2005}Tracer un trait

Résolu
swan94 Messages postés 254 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 2 avril 2010 - 22 sept. 2006 à 13:34
swan94 Messages postés 254 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 2 avril 2010 - 26 sept. 2006 à 22:42
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

Utilisateur anonyme
23 sept. 2006 à 15:50
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
3
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
22 sept. 2006 à 13:46
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.
0
drikce06 Messages postés 2237 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 11
22 sept. 2006 à 13:59
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
0
swan94 Messages postés 254 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 2 avril 2010
22 sept. 2006 à 14:44
Merci de vos réponses mais je n'arrive pas à lui faire comprendre que le nom choisi dans le listbox correspopnd à un controle.

Swan94
0

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

Posez votre question
drikce06 Messages postés 2237 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 11
22 sept. 2006 à 14:49
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
0
Utilisateur anonyme
22 sept. 2006 à 17:03
Salut,




Tu peux utiliser ca :





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



Kenji
0
swan94 Messages postés 254 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 2 avril 2010
23 sept. 2006 à 12:50
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
0
swan94 Messages postés 254 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 2 avril 2010
26 sept. 2006 à 22:42
Merci de votre aide et surtout toi Charles qui encore une fois m'a fourni un code complet et clair.

Swan94
0
Rejoignez-nous