Bonjour,
En m'inspirant de http://delphipage.free.fr/pboutons.html, je vous propose deux méthodes pour créer un bouton rond.
1ère méthode
Sur une forme, déposer un composant TButton et en faire un bouton carré. Ici les dimensions sont 60 x 60.
Ensuite appliquer le code sur l'évènement OnCreate de la forme.
On notera qu'il faut que la taille des arrondis (ici 120) soit bien supérieure à la taille des côtés du bouton (ici 60).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 procedure TForm1.FormCreate(Sender: TObject); var rgn : hrgn; begin //Changement du bouton carré vers rond with Form1.Btn1 do //Sur le bouton begin rgn:=CreateRoundRectRgn(1,1,width,height,120,120); //Arrondir les angles du bouton SetWindowRgn(handle, rgn, true); end; end;
Ensuite, on applique le code sur l'évènement OnPaint de la forme.
Résultat après compilation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 procedure TForm1.FormPaint(Sender: TObject); //Cercler le bouton begin Canvas.Pen.Width:=2; //Taille du trait Canvas.Pen.Color:=clActiveBorder; //Choix de la couleur with Form1.Btn1 do //Sur le bouton Canvas.Ellipse(left,top,width+left,height+top); //Forme ronde end;
2ème méthode
Sur une forme déposer deux composants TShape pris dans l'onglet Additional.
Il faut qu'ils aient absolument la même taille et mettre la propriété Shape à stCircle. Ici aussi les dimensions des TShape sont 60 x 60.
Il vaut mieux qu'ils soient de couleurs différentes. On jouera sur les propriétés Brush pour la couleur du fond et Pen pour la taille du trait (ici 1) de contour et sa couleur. Le premier TShape est de la couleur avant clic et l'autre de la couleur quand on clique dessus.
Ensuite, les deux TShape doivent être superposés exactement au même endroit sur la forme pour constituer un bouton unique. Le premier TShape doit être mis en avant du second.
Sur le nouveau bouton, on peut déposer un TLabel pour donner un intitulé au bouton.
Le code du bouton créé sera appliqué sur les évènements OnMouse du premier TShape.
Pour clic sur bouton :
Pour clic relâché (On notera que c'est à ce niveau que sera lancée l'opération à effectuer.) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin //Clic sur bouton Shape2.Visible:=True; //Apparence bouton appuyé visible Shape1.Visible:=False; //Apparence bouton relâché invisible end;
Si le pointeur est positionné sur le bouton, ce dernier change de couleur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 procedure TForm1.Shape1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin //Clic relâché Shape2.Visible:=False; //Apparence bouton appuyé invisible Shape1.Visible:=True; //Apparence bouton relâché visible //Opération à effectuer ShowMessage('Le bouton fonctionne !') //Exemple d'opération à effectuer end;
Quand le pointeur n'est plus positionné sur le bouton, ce dernier doit revenir à sa couleur initiale si c'est celle qui a été choisie.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 procedure TForm1.Shape1MouseEnter(Sender: TObject); begin //Pointeur sur bouton Shape1.Brush.Color:=$00FFFFDD; //Choix couleur end;
Résultat après compilation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 procedure TForm1.Shape1MouseLeave(Sender: TObject); begin //Pointeur plus sur bouton Shape1.Brush.Color:=cl3DLight; //Choix couleur end;
Pour conclure, la première méthode est rapide mais le résultat est un peu moins fin que pour la deuxième. Dans cette dernière, si on clique sur l'intitulé du bouton, le clic est sans effet. Il faut cliquer un peu à côté de l'intitulé. Ce petit souci peut être contourné en mettant la propriété Enabled du TLabel à False mais du coup l'intitulé apparaît dans une coloration atténuée. C'est possible aussi de mettre une image, une icône,..., en utilisant un composant TImage et la propriété Enabled peut être passée à False sans incidence sur l'aspect de l'image. Avec la deuxième méthode, on peut aussi par exemple réaliser un bouton triangulaire...
Résultat avec l'icône de Lazarus :
Partager