Problème avec un bouton personnalisé [Résolu]

Messages postés
67
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
13 novembre 2009
- - Dernière réponse : ThWilliam
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
- 11 août 2006 à 10:11
Bonjour,





 



J'ai créé un bouton personnalisé en forme de trapèze ou rectangle :
   __    __       _____      _
  / / ou \ \  ou |_____| ou | |
 / /      \ \               | |
/ /        \ \              | |





 



De plus ce bouton peut prendre différentes couleurs en fonction du programme.





 



Pour ce faire, j'ai crée un composant TGraphicControl, le dessin étant obtenu en dessinant avec un polyline.
Le problème est que le focus se fait sur les dimensions du TGraphicControl, de fait lorsque j'ai 2 boutons en trapèze côte à côte, le clic ne se fait pas forcément sur le bon bouton mais sur les dimensions de l'autre qui est en premier plan !
Ex:
btn1  btn2
   __ __
  /+// /
 / // / 
/ // /





 



Alors que le btn2 est en premier plan, si je clique là ou se trouve la croix (+) sur le btn1, c'est le btn 2 qui réagit.





 



Peut-on rendre le focus transparent ?
Peut-on contourner ce problème autrement ?
Tester avec certitude que l'on se trouve bien sur la partie colorée du bouton?





 



Merci de votre aide, je programme sous Delphi 5, mais si ça ne va pas on m'a dit qu'il existe une version gratuite de Delphi 2005, je suis prêt à l'utiliser si ça peut résoudre mon problème.





 




Merci,
Jean-Michel
Afficher la suite 

7 réponses

Meilleure réponse
Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1
3
Merci
jnmchl: si ton composant descend de TWinControl (et pas directement de TControl) tu peux utiliser les régions:

procedure TZarbiButton.MakeShape;
var
h:HRGN;
T:array[0..3] of TPoint;
begin
T[0]:=Point(0,0);
T[1]:=Point(Width div 2,0);
T[2]:=Point(Width,Height);
T[3]:=Point(Width div 2,Height);
h:=CreatePolygonRgn(T,4,WINDING);
SetWindowRgn(Handle,h,True);
DeleteObject(h);
end;

Lorsque tu appelles MakeShape, ton boutton prend automatiquement la forme que tu lui spécifie tant au niveau des messages de souris (MouseClick, MouseMove etc...) que du dessin (c'est à dire que même si tu dessines à l'extérieur de la forme, ça n'apparaitra pas).

Typiquement, il faudra appeler MakeShape en surchargeant les méthodes Resize et CreateWnd du contrôle:

procedure TZarbiButton.Resize;
begin
inherited Resize;
MakeShape;
end;

procedure TZarbiButton.CreateWnd;
begin
inherited CreateWnd;
MakeShape;
end;

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 205 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Forman
Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1
3
Merci
jnmchl: tu peux tout à fait faire descendre ton contrôle de TWinControl. Rajouttes-lui un champ FCanvas publié en propriété de type TCanvas, et dans la surcharge de son constructeur, tu peux faire:

constructor TZarbiButton.Create(AOwner:TComponent);
begin
inherited;
FCanvas:=TControlCanvas.Create;
(FCanvas as TControlCanvas).Control:=Self;
end;

et n'oublie pas de le détruire dans le destructeur ;-)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 205 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Forman
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
34
0
Merci
Salut,


regarde du coté de PtInRect, PtInRegion, RectInRegion de l'unité Windows
ça devrait résoudre ton problème

@+
Cirec
Commenter la réponse de Cirec
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
0
Merci
salut,

en voilà un problème intéressant. Je ne peux pas t'aider, mias j'espère voir ta source quand cela serra finit :)

bon code,
Commenter la réponse de cs_Loda
Messages postés
67
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
13 novembre 2009
1
0
Merci
@ CIREC, DRJEROME, FORMAN

Merci, c'est bien du côté des régions qu'il fallait que je m'oriente, je sens que j'approche du but ...
Justement comme tu le disais FORMAN, mon composant dérive de TGraphicControl, car j'utilise PAINT et CANVAS pour dessiner et écrire dans ce bouton, 
mais TGraphicControl ne gère pas le Handle nécessaire pour
SetWindowRgn(Handle,RegionP,True);
Faut-il et comment créer un handle à mon composant ?
ou existe-t-il la possibilité de créer PAINT et CANVAS dans un TWinControl ? 

Merci de vos conseils.
Jean-Michel
Commenter la réponse de jnmchl
0
Merci
Salut,

Pour répondre au propos du Loup : quand tu rajoutes une image tu as des dizaines de lignes de codes qui sont rajoutées à ton source (meme si tu les as pas codé toi meme). De plus la création de bouton est un tres bon exercice. De surcroit tu ne peux pas modifier dynamiquement un bouton par ta méthode (obligation d'utiliser un TListImage et charger les images à chaque modif : Un peu lourd).

BOn coding à tous
Commenter la réponse de Utilisateur anonyme
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
2
0
Merci
... ou, plus simple tu dérives ton composant de TCustomControl (qui ne fait qu'ajouter un Canvas à TWinControl).


Thierry
Commenter la réponse de ThWilliam