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

swan94 255 Messages postés jeudi 29 juillet 2004Date d'inscription 2 avril 2010 Dernière intervention - 22 sept. 2006 à 13:34 - Dernière réponse : swan94 255 Messages postés jeudi 29 juillet 2004Date d'inscription 2 avril 2010 Dernière intervention
- 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
Afficher la suite 

8 réponses

Répondre au sujet
Charles Racaud 3181 Messages postés dimanche 15 février 2004Date d'inscription 9 avril 2017 Dernière intervention - 23 sept. 2006 à 15:50
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Charles Racaud
Julien237 884 Messages postés vendredi 3 novembre 2000Date d'inscription 3 mars 2009 Dernière intervention - 22 sept. 2006 à 13:46
0
Utile
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.
Commenter la réponse de Julien237
drikce06 2247 Messages postés lundi 29 mai 2006Date d'inscription 29 mai 2008 Dernière intervention - 22 sept. 2006 à 13:59
0
Utile
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
Commenter la réponse de drikce06
swan94 255 Messages postés jeudi 29 juillet 2004Date d'inscription 2 avril 2010 Dernière intervention - 22 sept. 2006 à 14:44
0
Utile
Merci de vos réponses mais je n'arrive pas à lui faire comprendre que le nom choisi dans le listbox correspopnd à un controle.

Swan94
Commenter la réponse de swan94
drikce06 2247 Messages postés lundi 29 mai 2006Date d'inscription 29 mai 2008 Dernière intervention - 22 sept. 2006 à 14:49
0
Utile
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
Commenter la réponse de drikce06
Charles Racaud 3181 Messages postés dimanche 15 février 2004Date d'inscription 9 avril 2017 Dernière intervention - 22 sept. 2006 à 17:03
0
Utile
Salut,




Tu peux utiliser ca :





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



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

Swan94
Commenter la réponse de swan94

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.