jnmchl
Messages postés63Date d'inscriptiondimanche 16 octobre 2005StatutMembreDernière intervention13 novembre 2009
-
9 août 2006 à 22:03
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 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.
cs_Forman
Messages postés600Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 6 avril 20101 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;
cs_Forman
Messages postés600Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 6 avril 20101 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 ;-)
jnmchl
Messages postés63Date d'inscriptiondimanche 16 octobre 2005StatutMembreDernière intervention13 novembre 20091 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 ?
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).