Problème avec un bouton personnalisé

Résolu
jnmchl Messages postés 63 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 13 novembre 2009 - 9 août 2006 à 22:03
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

7 réponses

cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
10 août 2006 à 20:46
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;
3
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
11 août 2006 à 03:17
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 ;-)
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 août 2006 à 23:14
Salut,


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

@+
Cirec
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
10 août 2006 à 08:55
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,
0

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

Posez votre question
jnmchl Messages postés 63 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 13 novembre 2009 1
10 août 2006 à 23:17
@ 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
0
Utilisateur anonyme
11 août 2006 à 01:23
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
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
11 août 2006 à 10:11
... ou, plus simple tu dérives ton composant de TCustomControl (qui ne fait qu'ajouter un Canvas à TWinControl).


Thierry
0
Rejoignez-nous