Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

RAJOUTTER DES BOUTTONS SUR LA BARRE DE TITRE D'UNE FENÊTRE


Information sur la source

Catégorie :Graphique Classé sous : titlebar, button Niveau : Débutant Date de création : 07/07/2006 Vu / téléchargé: 3 029 / 733

Note :
9,5 / 10 - par 2 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Le package fourni rajoutte un nouveau composant dans la barre "additional": le TTitleBarButtonsManager. Il permet de rajoutter des boutons personnalisés dans la barre de titre d'une fenêtre. Ce composant a seulement 3 propriétés publiées :

    property Form:TCustomForm read FForm write SetForm;    //La fenêtre qui va recevoir les bouttons sur sa barre de titre (par exemple, mettre "Form1" si votre form s'appelle comme ça)

    property Buttons:TTitleBarButtons read FButtons write SetButtons;   //Une collection de TTitleBarButton (voir plus bas)

    property Spacing:Integer read FSpacing write SetSpacing default 2;  //L'espace entre les bouttons



 

Source

  • Voilà les propriétés publiées des TTitleBarButton :
  • property OnClick:TNotifyEvent read FOnClick write SetOnClick; //Click sur le boutton
  • property OnPaint:TTitleBarButtonPaintEvent read FOnPaint write SetOnPaint; //Gestionnaire d'affichage personnalisé
  • property Width:Integer read FWidth write SetWidth; //Largeur (la hauteur est définie par Windows et le thème courant)
  • property Enabled:Boolean read FEnabled write SetEnabled; //Bouton actif ou non
  • property Name:string read FName write SetName; //Un nom (comme un nom de composant) pour faciliter la lecture du code.
  • L'événement OnPaint est déclaré comme suit:
  • TTitleBarButtonState=(tbsDisabled,tbsDown,tbsHot);
  • TTitleBarButtonStates=set of TTitleBarButtonState;
  • TTitleBarButtonPaintEvent=procedure(Sender:TObject;Canvas:TCanvas;Rect:TRect;State:TTitleBarButtonStates) of object;
  • Il suffit de dessiner ce que l'on veut sur le Canvas tout en restant dans le rectangle Rect. State permet de savoir quel est l'état du bouton (tbsDown=enfoncé, tbsHot=souris au-dessus, tbsDisabled=bouton inactif).
Voilà les propriétés publiées des TTitleBarButton :

    property OnClick:TNotifyEvent read FOnClick write SetOnClick;                //Click sur le boutton
    property OnPaint:TTitleBarButtonPaintEvent read FOnPaint write SetOnPaint;   //Gestionnaire d'affichage personnalisé

    property Width:Integer read FWidth write SetWidth;                           //Largeur (la hauteur est définie par Windows et le thème courant)

    property Enabled:Boolean read FEnabled write SetEnabled;                     //Bouton actif ou non

    property Name:string read FName write SetName;                               //Un nom (comme un nom de composant) pour faciliter la lecture du code.

L'événement OnPaint est déclaré comme suit:

  TTitleBarButtonState=(tbsDisabled,tbsDown,tbsHot);

  TTitleBarButtonStates=set of TTitleBarButtonState;

  TTitleBarButtonPaintEvent=procedure(Sender:TObject;Canvas:TCanvas;Rect:TRect;State:TTitleBarButtonStates) of object;

Il suffit de dessiner ce que l'on veut sur le Canvas tout en restant dans le rectangle Rect. State permet de savoir quel est l'état du bouton (tbsDown=enfoncé, tbsHot=souris au-dessus, tbsDisabled=bouton inactif).

Conclusion

J'ai mis un programme d'exemple pour illustrer le fonctionnement. Comme vous pourrez le constater, les boutons s'adaptent à tous les styles de bords de fenêtre (BorderStyle) et leur position s'adapte aussi à la propriété BorderIcons des fiches. J'ai conscience que mes boutons sont très laids sur la capture, mais grâce à l'événement OnPaint vous pourrez développer toute votre créativité et faire beaucoup mieux!
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de Forman le 07/07/2006 01:56:26

Oups, j'ai programmé tout ça vite fait et je viens de me rendre compte que j'ai oublié d'implémenter le comportement "disabled" des bouttons (c'est à dire qu'ils recevront quand même les clicks de souris même avec Enabled=False). Je corrigerai cela dans une prochaine mise à jour...

signaler à un administrateur
Commentaire de Emandhal le 07/07/2006 12:38:52

Salut, ca m'interesse, mais pas encore eut le temps de tester. Mais j'aimerai savoir si le composant s'adapte aussi au thème utilisé par windows?
Continue de coder ^^
bye

signaler à un administrateur
Commentaire de hendrix le 07/07/2006 16:19:37

excellent cette idée de bouton sur la barre de titre... va falloir que je teste ce code !!!!
@+

signaler à un administrateur
Commentaire de Forman le 07/07/2006 16:43:25

C'est bizarre je croyais avoir posté un commentaire mais il a disparu...

À Emandhal:
oui le composant peut s'adapter au thème courant: par défaut le composant ne peint rien sur le bouton. Donc, c'est à toi lorsque tu définis l'événement OnPaint de le faire ;) ;) ;)
Comment? je ne sais pas, mais je pense qu'en étudiant l'unité Themes de Delphi on devrait pouvoir trouver comment faire...
Mon composant ne fait rien d'autre que de remplacer la WindowProc de la Form associée, et de rederiger les messages de souris et de raffraichissement dans les événements concernés via celle-ci.

À Hendrix:
Merci!

signaler à un administrateur
Commentaire de Loda le 12/09/2006 10:00:00

salut,

j'ai regarder ta source, elle est bien. C'est du joli boulot.

Y a des systèmes que je connaissait pas, genre TTrackMouseEvent.


mais, plus particulièrement, je comprend pas dans
procedure TTitleBarButtonsManager.SetForm(const Value: TCustomForm);

pourquoi tu fais ça:
    if FForm.HandleAllocated then
      TCustomFormHack(FForm).RecreateWnd;

POurquoi le recreer seulement si il exist deja.
d'ailleur, la lib test que l'handle exist avant de le recreer.
de plus, le handle est créer si necessaire lorsque tu le demande (Form.Handle)

pourrais-tu m'éclairer?

merci,

signaler à un administrateur
Commentaire de Forman le 12/09/2006 13:15:07

Salut,

le composant qui crée les bouttons sur la form remplace la WindowProc de celle-ci par une autre. Ce remplacement peut intervenir après que la form ait déjà créé son Handle. Or, le composant a besoin du message WM_NCCREATE (envoyé par Windows juste au moment de la création du Handle) pour positionner les boutons la première fois. Donc, si le Handle est déjà créé, lors du remplacement de la WindowProc, le composant oblige la form a le recréer pour que ce fameux message WM_NCCREATE soit de nouveau envoyé, tout simplement.

signaler à un administrateur
Commentaire de Loda le 12/09/2006 15:26:31

merci,
c'est plus clair. Mais je ne voit pas pourquoi on applerais pas "à la main" UpdateButtonsPos. ça ne marcherais pas?

En passant, tu n'as pas prévu le cas des MDIChild. Les TPoint sont pas juste. Dans les function ClientToNC et ScreenToNC tu supposes que la form est positionée relativement à screen. ce qui n'est pas le cas en MDIChild. Je vais implementer ça sous peu...

signaler à un administrateur
Commentaire de Forman le 12/09/2006 16:04:17

Oui c'est vrai qu'on peut faire comme tu dis. Pour les MDIChild, essaie aussi de penser à traiter le cas où la Form a un Parent ou un ParentHandle, c'est pareil.

signaler à un administrateur
Commentaire de Loda le 12/09/2006 16:33:46

salut,

alors, l'idée de base c'était de récuperer le parent, mais comme tu le dit, c'est pas toujours possible. Je me suis donc orienté sur une solution moins propre, mais qui marche pour mon cas, j'utilise la var global de ma MainMDIForm (oui, c'est moche).

juste pour que tu saches:

Le seul problème que j'ai eut est lié aux converstions de position:
Les fenêtre MDI peuvent se position dans le client area de la main form. soit de 0,0 à X,Y.
MAIS si tu met un Panel avec alLeft, ton "(0,0)" de tes MDIChild serront en fait à (20,0) du ClientAre de ta form principal. Cependant, MDIChild.Left est toujours égal à 0 et ce même si c'est 20 du client are.

et donc, quand tu fais un MainMDI.ClientToScreen(MDIChild.TopLeft), t'as un resultat faux. (de la largeur du panel)
tu doit calculer la vrai origine de ta zone MDI (relative to screen) et l'ajouter.
Perso, j'utilise la position d'une image en alClient (le nb et la position de mes panels sur les côté étant paramétrable)

voilà. je vois pas de façon d'implementer ça de manière générique, a part en parcourant les tableau de composant.

je te remercie pour tes réponses, et si je fais des modif intéressante, je te dirais.

bon code,

signaler à un administrateur
Commentaire de Forman le 12/09/2006 20:02:14

Peut-être que ClientOrigin ou CLientToScreen sont des pistes pour régler le problème?

signaler à un administrateur
Commentaire de Loda le 13/09/2006 13:19:28

non, justement c'est le problème.

ClientToScreen se base sur ClientOrigine. et ClientOrigine retourne toujours (0,0).

Mais quand je dock un panel(width=20) sur le côté gauche, mon MDIChild.Left = 0 alors qu'il devrait être à 20.

le problème est que l'origine pour les forms MDI est différent de celui pour le ClientArea. (oui c'est zarbe).

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Button envoyan vers une page web ??? [ par Niala ] Salut, comment je fais pour mettre un boutons vers un site internet explorer.ex: je cree un boutton je clik decu et quesque jecrit???merci de me repon Button envoyan vers une page web ??? [ par Niala ] Salut, comment je fais pour mettre un boutons vers un site internet explorer.ex: je cree un boutton je clik decu et quesque jecrit???merci de me repon creation de button sans le declarer [ par g0belin ] voila j'aimerai faire quelque chose comme sa :var i:integer;beginfor i:=1 to 10 do begin Tbutton(inttostr(i)).create; end;je sais que c'est possi Button Hide or Show [ par Ark1 ] Hello all,Enfait j'ai fait un programme qui nécessite en fonction du moment soit l'affichage de tout les boutons (16) ou le "hide" de tout les boutons Button Et WebBrowser. [ par BenXbox ] 1 - Comment sur Delphi avec un Button on "Copie" ce qu' il y a dans un WebBrowser ?2 - Comment sur Delphi avec un Button on "Colle" ce qu' il y a dans Button et image, demande a tous le monde ;-) [ par weldoo ] slt a tous je recherche un composant pour réaliser des bouton style pla ! un p comme internet explorer...aussi a y integrer une image et du texte sur Besoin d'aide avec les labels [ par Programmeur1987 ] Je veut, dison que j'ai x label dans ma form et un text box et un button, bon je veut que j'aye a écrire dans mon edit le nom d'un label et quand je c taborder ou es tu ??? [ par bilou2000 ] Bonjours et bonne année. excusez moi j'ai eu des petits soucis avec internet explorer.j'ai deux composants button arrow et hemisphere sans tabord un son avec un button [ par ced55957 ] cedricbonjour comment fait on pour jouer un son( mp3 ou wav) en cliquant sur un bouton??merci d'avance Button sur DELPHI [ par djelaba91 ] Bonjour, j'aimerais modifier la couleur de mon Button sur DELPHI comment faire ?


Nos sponsors

Sondage...

CalendriCode

Novembre 2008
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Appels d'offres

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,452 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.