Rajoutter des bouttons sur la barre de titre d'une fenêtre

Soyez le premier à donner votre avis sur cette source.

Vue 6 715 fois - Téléchargée 1 101 fois

Description

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 / Exemple :


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!

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
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).
Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1
Peut-être que ClientOrigin ou CLientToScreen sont des pistes pour régler le problème?
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
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,
Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1
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.
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
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...
Afficher les 11 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.