Comment implémenter des info-bulles In-Place
Les info-bulles sur place sont utilisées pour afficher des chaînes de texte pour les objets qui ont été clippés. Pour obtenir une illustration, consultez À propos des contrôles d’info-bulle.
La différence entre les info-bulles ordinaires et les info-bulles sur place est le positionnement. Par défaut, lorsque le pointeur de la souris pointe sur une région à laquelle une info-bulle est associée, l’info-bulle s’affiche à côté de la région. Toutefois, les info-bulles sont des fenêtres, et elles peuvent être positionnées n’importe où de votre choix en appelant SetWindowPos. La création d’une info-bulle sur place consiste à positionner la fenêtre d’info-bulle afin qu’elle superpose la chaîne de texte.
- C/C++
- Programmation de l’interface utilisateur Windows
Vous devez effectuer le suivi de trois rectangles lors du positionnement d’une info-bulle sur place :
- Rectangle qui entoure le texte complet de l’étiquette.
- Rectangle qui entoure le texte de l’info-bulle. Le texte de l’info-bulle est identique au texte complet de l’étiquette et a normalement la même taille et la même police. Les deux rectangles de texte seront donc généralement de la même taille.
- Rectangle de fenêtre d’info-bulle. Ce rectangle est un peu plus grand que le rectangle de texte d’info-bulle qu’il entoure.
Les trois rectangles sont illustrés schématiquement dans l’illustration suivante. La partie masquée du texte de l’étiquette est indiquée par un arrière-plan gris.
Pour créer une info-bulle sur place, vous devez positionner le rectangle de texte d’info-bulle afin qu’il superpose le rectangle de texte d’étiquette. La procédure d’alignement des deux rectangles est relativement simple :
- Définissez le rectangle de texte d’étiquette.
- Positionnez la fenêtre d’info-bulle de sorte que le rectangle de texte d’info-bulle superpose le rectangle de texte d’étiquette.
Dans la pratique, il suffit généralement d’aligner le coin supérieur gauche des deux rectangles de texte. La tentative de redimensionnement du rectangle de texte d’info-bulle pour qu’il corresponde exactement au rectangle de texte d’étiquette peut entraîner des problèmes avec l’affichage de l’info-bulle.
Le problème avec ce schéma simple est que vous ne pouvez pas positionner directement le rectangle de texte d’info-bulle. Au lieu de cela, vous devez positionner le rectangle de la fenêtre d’info-bulle juste assez loin au-dessus et à gauche du rectangle de texte d’étiquette pour que les coins des deux rectangles de texte coïncident. En d’autres termes, vous devez connaître le décalage entre le rectangle de la fenêtre d’info-bulle et son rectangle de texte fermé. En général, il n’existe pas de moyen simple de déterminer ce décalage.
Le fragment de code suivant montre comment utiliser un message TTM_ADJUSTRECT dans un gestionnaire de TTN_SHOW pour afficher une info-bulle sur place. Votre application indique que le texte d’étiquette est tronqué en définissant la variable privée fMyStringIsTruncated sur TRUE. Le gestionnaire appelle une fonction définie par l’application, GetMyItemRect, pour récupérer le rectangle de texte d’étiquette. Ce rectangle est passé au contrôle d’info-bulle avec TTM_ADJUSTRECT, qui retourne le rectangle de fenêtre correspondant. SetWindowPos est ensuite appelé pour positionner l’info-bulle sur l’étiquette.
case TTN_SHOW:
if (fMyStringIsTruncated)
{
RECT rc;
GetMyItemRect(&rc);
SendMessage(hwndToolTip, TTM_ADJUSTRECT, TRUE, (LPARAM)&rc);
SetWindowPos(hwndToolTip, NULL, rc.left, rc.top, 0, 0,
SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
}
Cet exemple ne modifie pas la taille de l’info-bulle, mais seulement sa position. Les deux rectangles de texte sont alignés dans leur coin supérieur gauche, mais pas nécessairement avec les mêmes dimensions. Dans la pratique, la différence est généralement faible, et cette approche est recommandée dans la plupart des cas. Bien que vous puissiez, en principe, utiliser SetWindowPos pour redimensionner et repositionner l’info-bulle, cela peut avoir des conséquences imprévisibles.
La version 5.80 des contrôles communs simplifie l’utilisation des info-bulles sur place en ajoutant un nouveau message, TTM_ADJUSTRECT. Envoyez ce message avec les coordonnées du rectangle de texte d’étiquette sur lequel vous souhaitez que l’info-bulle soit superposée, et il retourne les coordonnées d’un rectangle de fenêtre d’info-bulle correctement positionné.