Site:  Cours VB.net  
3.10 Positionnons les contrôles et formulaires.

On peut dimensionner et positionner les contrôles et formulaires:

    En mode conception.

    Mais aussi avec du code.

 

Tous les contrôles héritent donc tous de la classe Windows Forms.

Les contrôles et formulaires ont tous des propriétés communes.

Unité de mesure :

Pixel:

L'unité de mesure est le 'Pixel'  (Picture Elément).(plus de twips)

Les coordonnées d'un contrôle se définissent à partir du coin supérieur gauche du conteneur (coin situé sous la barre de tache dans le cas du formulaire).

Noter qu'à partir du coin supérieur gauche, l'axe des X va de gauche à droite, l'axe des Y de haut en bas.

 

 

Le Point:

Pour définir une paire de coordonnées on utilise un objet Point ( ou System.Drawing.Point)contenant les coordonnées x et y du point:

 

Dim P As New Point(12,45)    'Ici 12 et 45 sont les coordonnées X et Y du point.

On peut utiliser P.x  et P.y pour modifier une coordonnée.

 

La taille:

Pour définir la taille d'un contrôle on utilise un objet Size ( ou System.Drawing.Size)contenant 2 integers indiquant habituellement largeur et hauteur:

 

Dim S As New Size(12,45) .

 

 

Position initiale dans l'écran d'un formulaire:

On peut définir la position initiale, sur l'écran, d'un formulaire grâce à la propriété 'StartPosition':

Le formulaire peut apparaître au centre de l'écran (CenterScreen)ou à des coordonnées précises.

De plus la propriété WindowState permet de définir la taille du formulaire: normal, plein écran (Maximized) ou réduit dans la barre de tache (Minimized).

 

Taille et position d'un formulaire ou d'un contrôle:

On peut utiliser simplement:

Left, Top coordonnées du coin supérieur gauche et Bottom, Right inférieur droit.

Height, Width pour la hauteur et la largeur du contrôle en pixels.

 

On peut utiliser aussi:

Size : hauteur, largeur peuvent aussi être utilisées.

Location : coordonnées X,Y du coin supérieur droit du contrôle en pixels.

SetBounds : coordonnées X,Y , largeur, hauteur.

 

Exemple :

Button.left=188

Button.Top =300

Ou

Button.Location= New System.Drawing.Point(188,300)

Point() positionne un point dans l’espace.

On remarque qu'il faut donner à la propriété Location un objet Point et non les coordonnées brutes.(En effet, Form1.Location =100, 100 n'est pas accepté)

Form1.Location = New Point(100, 100) est équivalent à:

Form1.left=100: Form1.Top=100

 

Pour définir la taille:

Dim Me.Size= New Size(150,150)

On créer un objet Size que l'on affecte à la propriété size du contrôle.

 

On peut aussi donner la position et les dimensions du contrôle en une fois

Exemple pour le formulaire courant:

Me.SetBounds (12, 15, 100, 100)    'X,Y, Width, Height.

Form1.DesktopLocation = new Point(100,100) 'Ici on donne les coordonnées par rapport à la barre de tache.

 

En mode conception il est bien plus simple de dimensionner les contrôles à la main dans la fenêtre Design. 

 

 

Pour le re-dimensionnement de fenêtre par l'utilisateur:

Pour que l’utilisateur puisse redimensionner la fenêtre(en cliquant sur les bords) il faut que la propriété FormBorderStyle de la fenêtre soit  Sizable. (FixedSingle interdit le re-dimensionnement)

ControlBox permet d'afficher la boite de contrôles( bouton d'agrandissement, réduction, fermeture du formulaire) en haut à droite de la barre de tache.

MaximizedBox et MinimizedBox permettent d'utiliser les boutons d'agrandissement ou de réduction du formulaire.

Exemple d'un formulaire ayant ControlBox =True, MinimizedBox =True, MaximizedBox =True et FormBorderStyle= Sizable (les bords de la fenêtre on 2 traits, ce qui permet le redimentionnement).

Après que l'utilisateur ai modifié les dimensions du formulaire, on peut intervenir sur les dimensions du formulaire, pour cela on utilise l'évènement Form.Resize qui est déclenché quand les dimensions du formulaire sont modifiées par l'utilisateur: dans Form.Resize on peut intervenir sur les dimensions du formulaire ou des contrôles:

Exemple: permettre à l'utilisateur de modifier la hauteur mais imposer une largeur  de formulaire de 200 pixels.

Private Sub Form1_Resize()

Me.Width = 200

End Sub

Noter que dans Form.Resize on peut récupérer les dimensions du formulaire avec Me.

Les propriétés MaximmunSize et MinimunSize imposent les dimensions maximales et minimales d'un formulaire, ce qui permet de se passer du code qui précède.

Mais si l’utilisateur modifie la taille du formulaire qui contient les contrôles, la taille des contrôles ne suit pas.

Avant cette version VB.net, il fallait dans l’événement Form_Resize, déclenché par la modification des dimensions de la fenêtre, écrire du code modifiant les dimensions et positions des contrôles afin qu’ils s’adaptent à la nouvelle fenêtre:

Exemple: La largeur d'une TextBox se modifie en fonction de la dimension du formulaire.

Private Sub Form1_Resize()

TextBox.Width = Me.Width-50

End Sub

 

En VB.Net c'est plus facile avec Dock et Anchor (voir plus bas).

 

Déplacement.

Form1.Left += 200    'déplace le formulaire de 200 pixels

 

'déplacement progressif d'un bouton de gauche à droite:

For i As Integer =0 to 100

    Button1.Left= i

Next i


 

Coordonnées souris:

 

Certains évènements relatif à la souris comme  MouseDown (appuyer sur le bouton) MouveUp (relâcher le bouton), MouseMove (déplacer le bouton) ont comme paramètre e qui contient les coordonnées souris, elles sont dans e.X et e.Y, ce sont bien les coordonnées DANS le contrôle (coordonnées 'client').

Private Sub ListBox2_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox2.MouseDown

End Sub

 

Mais attention, dans les évènement relatifs au Drag and Drop (DragOver par exemple) ce sont les coordonnées écran. Si je veux avoir des coordonnées relatives à l'objet graphique en cours, il faut les transformer à l'aide de PointToClient qui transforme un point écran en point client:

Exemple: La souris survole ListBox2 , on a e.X et e.Y, coordonnées de l'écran, comment obtenir le Point par rapport à la listbox?

On transforme e.X et e.Y en coordonnées client (par rapport à la listBox)

 

Private Sub ListBox2_DragOver(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox2.DragOver

MonImage.Location=ListBox2.PointToClient(New Point(e.X, e.Y)

 

 En plus ListBox2.IndexFromPoint(ListBox2.PointToClient(New Point(e.X, e.Y)) retourne l'index survolé.

 

PointToScreen fait l'inverse (coordonnées listbox=> coordonnés écran).

 

Anchor :

Cette propriété des objets permet d’ancrer les bords. Un bord ancré reste à égale distance du bord du conteneur quand le conteneur (la fenêtre) est redimensionné.

En mode conception il suffit de cliquer sur '. . .'  en face de Anchor pour voir s’ouvrir une fenêtre, cliquer sur les bords que vous voulez ancrer.

Par défaut les bords Top (haut) et left(gauche) sont ancrés.

Expliquons !!

Left est ancré, si je déplace le bord droit de la fenêtre, le contrôle n’est pas déplacé car la distance bord gauche de la fenêtre et bord gauche du contrôle est fixe. Par contre si je déplace le bord gauche de la fenêtre, le contrôle suit.

Exemple :

Prenons 2 contrôles dans une fenêtre, celui de gauche a Anchor =left et celui de droite à Anchor =left et right.

Si je déplace le bord droit (ou le gauche d’ailleurs) : le contrôle droit est redimensionné car la distance 'bord gauche du conteneur-bord gauche du contrôle droit' est fixe., les 2 contrôles restent cote à cote.

 

 

Dock

Cette propriété des objets amarre aux bords. La bordure spécifiée est ancrée directement au conteneur.

Exemple: le contrôle de droite est Dock=Right  (Anchor=None)

 Le bord droit du contrôle est accroché au bord droit du conteneur. Le contrôle droit est déplacé sans être redimensionné.. 

 Il y a même possibilité d’amarrer aux 4 bords (Dock=Fill) pour remplir le conteneur, et de modifier la propriété DockPaddind du formulaire afin se s’éloigner légèrement des bords pour faire joli.

 

Spliter

Le contrôle Splitter  sert à redimensionner des contrôles  au moment de l'exécution par l'utilisateur.

Le contrôle Splitter est  utilisé dans les applications dont les contrôles présentent des données de longueurs variables, comme l'Explorateur Windows.

 Pour permettre à un utilisateur de redimensionner un contrôle ancré au moment de l'exécution, ancrer le contrôle à redimensionner au bord d'un conteneur, puis ancrez un contrôle Splitter sur le même côté de ce conteneur.

En VB.Net 2005 il existe aussi SplitContainer qui est plus pratique que Spliter et LayoutPanel voir 3-9