Application Desktop Toolbar (AppBar) | Application Desktop Toolbar (AppBar) |
Even if you don't know what an Application Desktop Toolbar is, you're using at least one. The Windows taskbar is an Application Desktop Toolbar (in short an AppBar). The MSOffice Toolbar is an AppBar too. | Même si vous ne savez pas ce qu'est une Application Desktop Toolbar (en abrégé AppBar), vous en utilisez au moins une. La barre de tâche de Windows est une Application Desktop Toolbar, de même que la barre de bouton de MSOffice. |
You will learn, in this article, how to create an AppBar, how to put buttons or other controls on it and how to drop files to the AppBar and create a button allowing you to open the file. Our AppBar will look like this : | Dans cet article, vous apprendrez à créer une AppBar, à placer des boutons ou d'autres contrôles et à gérer le drag and drop de façon à créer automatiquement un bouton qui permettra d'ouvrir un fichier. Notre AppBar ressemblera à ceci : |
What is an AppBar? | Qu'est-ce qu'une AppBar? |
Basicaly, an AppBar is a window that can be docked to an edge
of the screen. The workarea of the screen is shrunk so that whenever
you maximizes a window, that window doesn't hide any AppBar. An AppBar
can be moved by dragging the AppBar client's window and docked to
another edge. |
Une AppBar est une fenêtre normale qui peut être arrimée à un des bords de l'écran. La zône utilisable de l'écran est alors diminuée de façon à ce que lorsque vous maximalisez une fenêtre, celle-ci ne se superpose pas à une AppBar. Vous pouvez bouger l'AppBar en la tirant avec la souris et éventuellement l'arrimer à un autre bord de l'écran. |
How does it work? | Comment faire? |
When you create, remove an AppBar, set its size or position,
you send messages to the AppBar using a special function SHAppBarMessage()
and a structure APPBARDATA filled with the required parameters.
|
Lorsque vous créez ou supprimez une AppBar, lorsque vous changez sa taille ou sa position, vous envoyez à l'AppBar un message particulier en utilisant la fonction SHAppBarMessage() et en remplissant la structure APPBARDATA avec les valeurs nécessaires. |
How to create and remove an AppBar? | Comment créer et supprimer une AppBar? |
To create an AppBar, you have to register it because Windows
keeps a list of all registered AppBars. This list is used to manage all
AppBars. |
Lorsque
vous créez une AppBar, vous devez l'enregistrer. Windows garde
en mémoire une liste de toutes les AppBars créées
de façon à les gérer correctement. Ouvrez un nouveau projet. Sur le formulaire, placez un TSpeedButton, un TImage, un TEdit et un second TSpeedButton. Le TEdit nous servira à introduire une adresse Internet et le second SpeedButton nous permettra de lancer le browser pour avoir accès à cette adresse. La position de chaque composant n'a pas d'importance, nous recalculerons sa position par code. |
Unit.h : |
As you can see in the header above, we will override the CreateParams() function of the form to remove its caption bar. We override the WndProc() function as well to respond to messages send by windows to our AppBar. | Vous aurez remarqué que nous surchargeons la fonction CreateParams() de la fenêtre pour supprimer la caption bar de celle-ci. Nous surchargeons aussi la fonction WndProc() pour pouvoir répondre aux messages envoyer par Windows à notre AppBar. |
Unit1.cpp : |
Above, we have registered our AppBar sending the ABM_NEW message. Setting its size and position is not trivial. Because our AppBar can't interfere with already existing AppBars, we propose an edge and a rectangle using the ABM_QUERYPOS message. Windows will alter the position if needed. Once we have the position we calculate the size and call SHAppBarMessage() with the ABM_SETPOS message. Now, we finally have the size and position of the AppBar and we can move it to the correct location using SetWindowPos(). | Ci-dessus, nous avons enregistré notre AppBar en envoyant le message ABM_NEW. A cause du fait que notre AppBar ne peut interférer avec une autre AppBar qui se trouverait déjà sur le même bord que la nôtre, nous devons proposer au shell un rectangle où nous aimerions placer l'AppBar. Ceci est réalisé en envoyant le message ABM_QUERYPOS. En retour, Windows nous renvoie la position où notre AppBar peut se trouver sans interférer avec une autre AppBar. Ensuite, on calcule la taille de l'AppBar et celle-ci est proposée au shell par le message ABM_SETPOS et enfin, nous pouvons placer notre AppBar avec la fonction SetWindowPos(). |
Unit1.cpp : |
The CalcComponentPos() function doesn't need a lot of explanation. We first iterate through all the components on our form to get the biggest Height and Width. This is needed to determine the size of our AppBar. We then iterate through the components to set the Top and Left properties of each component so that they will always be well positionned depending on the edge. | La fonction CalcComponent() est assez simple. Elle permet de déterminer la taille de notre AppBar. Celle-ci varie d'après le bord choisi. Dans le cas du bord droit par exemple, la largeur de notre AppBar doit au moins être égale à la largeur du plus grand composant. Dans le cas du bord supérieur, la hauteur de l'AppBar doit être égale au moins à la hauteur la plus grande des composants. Ensuite, on calcule pour chaque composant ses propriétés Left et Top. |
Unit1.cpp : |
Here,
we have overridden the WndProc()
method of a form to respond to special notification messages sent by
windows to our AppBar. These are sent when the state, the size or the
position of the AppBar changes or when an application is launched in
full-screen mode. See the online help for details. The most important
is the ABN_POSCHANGED. It is sent when our AppBar or
another one has changed its size or position. The ABN_STATECHANGE
is sent when the state of the AppBar has changed. The ABN_FULLSCREENAPP
is sent when a full-screen App is launched or closed. When we drag our AppBar we receive a WM_MOVING message. See the code below : |
Windows
envoie à notre AppBar certains messages. Pour traiter ces
messages, nous surchargeons la méthode WndProc() de
notre fenêtre. ces messages sont envoyés pour signaler que
l'état (ABN_STATECHANGE), la taille ou la position (ABN_POSCHANGED)
de l'AppBar a changé ou bien qu'une application a
été lancée en mode plein-écran ou qu'on a
fermé une application qui était en mode
plein-écran (ABN_FULLSCREENAPP). lorsque nous déplaçons notre AppBar, nous recevons le message WM_MOVING. Voir le code ci-dessous : |
Unit1.cpp : |
When receiving the WM_MOVING message, we create 4 rectangles and check if the mouse is in one of them, changing, accordingly, the APPBARDATA parameters. | Lorsqu'on reçoit le message WM_MOVING, on crée 4 rectangles correspondant aux 4 bords de l'écran et on teste si la souris se trouve dans l'un de ces rectangles. Si c'est le cas, les paramètres de la structure APPBARDATA sont modifiés en conséquence. |
Removing the form caption : | Suppression de la caption bar de la fenêtre : |
Our AppBar is functional, but how to get rid of the caption
bar? |
Notre AppBar est maintenant fonctionnelle. Il nous reste à nous débarasser de la caption bar de la fenêtre. On réalise ceci en surchargeant la méthode CreateParams() de la fenêtre. Pour pouvoir bouger l'AppBar en cliquant dans la zône client de la fenêtre, on va insérer quelques lignes de code dans l'événement OnMouseDown de la fenêtre. |
Unit1.h : |
Finally, put the code below in the OnClick event of the second SpeedButton to be able to launch your browser with the address specified in the TEdit control. | La dernière chose à faire est de lancer le browser avec l'adresse spécifiée dans le composant TEdit lorsqu'on clique sur le second SpeedButton. Placez le code ci-dessous dans l'événement OnClick du second SpeedButton. |
Unit1.h : |
Note : | Remarque : |
Some features of AppBars are not used here. For instance, the
auto-hide feature or the always-on-top feature. See the online help or
Microsoft MSDN if you want to implement these features. |
Certaines caractéristiques des AppBars ne sont pas utilisées ici comme, par exemple, le mode 'auto-hide' ou 'always-on-top'. Pour en savoir plus, consultez l'aide en ligne ou la bibliothèque Microsoft MSDN. |
Dropping files and creating buttons : | Gérer le drag and drop et création de boutons : |
One of the nice usage of AppBars is the ability to put buttons
on it to quickly launch applications. I'll show you below how to drop
files on the AppBar and how to automaticaly create a button to launch
that file. |
Vous pouvez utiliser une AppBar comme toolbar et y placer des boutons pour lancer rapidement différentes applications. Ci-dessous, vous trouverez le code nécessaire pour faire un drag and drop d'un fichier sur la AppBar et pour créer automatiquement un bouton permettant d'ouvrir ce fichier. |
private: // User declarations |
The DragAcceptFiles() is telling our AppBar to accept dropped files. In the OnDropFiles(), we first get the filename using DragQueryFile().The filename is saved in a TStringList. Then, we get the icon associated with the file. The ImageList is used to transform an icon to a bitmap because the TSpeedButton glyph property is of type TBitmap. When we have the icon, we create the SpeedButton and set its event OnClick to our function DraggedButtonClick(). The Tag property of the SpeedButton is used to differentiate two buttons. We then send the ABN_POSCHANGED message to repaint the AppBar.. | La fonction DragAcceptFiles() est utilisée pour spécifier que notre AppBar peut recevoir des fichiers que l'on 'droppe' sur elle. Dans la fonction OnDropFiles(), nous récupérons d'abord le nom et le path du fichier. Celui-ci est sauvegardé dans un TStringList. Ensuite, on récupère l'icône associée à ce fichier et on crée un bouton pour ouvrir ce fichier. Le TImageList est utilisé pour convertir une icône en bitmap. En effet, la propriété Glyph d'un SpeedButton est du type TBitmep. L'événement OnClick du SpeedButton pointe vers notre fonction DraggedButtonClick(). La propriété Tag sert à différencié les SpeedButtons entre eux. Finalement, on envoie à l'AppBar le message ABN_POSCHANGED pour que le nouveau bouton soit bien positionner dans l'AppBar. |
You have to provide a way to save the parameters and filename of each button in an .ini file or in the registry. No code is given here to do this. | Vous devez, vous même, trouver un moyen de sauver dans un fichier .ini ou dans la base de registre les paramètres et le nom du fichier pour chaque bouton créé de façon à pouvoir relancer l'application avec les boutons créés précédemment. Aucun code n'est donné ici pour réaliser cela. |
Complete project source code (BCB4) : AppBarsrc.zip | Source complète du projet (BCB4) : AppBarsrc.zip |