Partager via


Comment implémenter des info-bulles de suivi

Les info-bulles de suivi restent visibles jusqu’à ce qu’elles soient explicitement fermées par l’application et peuvent changer de position sur l’écran dynamiquement. Ils sont pris en charge par les versions 4.70 et ultérieures des contrôles courants.

Pour créer une info-bulle de suivi, incluez l’indicateur TTF_TRACK dans le membre uFlags de la structure TOOLINFO lors de l’envoi du message TTM_ADDTOOL .

Votre application doit activer manuellement (afficher) et désactiver (masquer) une info-bulle de suivi en envoyant un message TTM_TRACKACTIVATE . Lorsqu’une info-bulle de suivi est active, votre application doit spécifier l’emplacement de l’info-bulle en envoyant TTM_TRACKPOSITION messages au contrôle d’info-bulle. Étant donné que l’application gère des tâches telles que le positionnement de l’info-bulle, les info-bulles de suivi n’utilisent pas l’indicateur TTF_SUBCLASS ou le message TTM_RELAYEVENT .

Le message TTM_TRACKPOSITION entraîne l’affichage de la fenêtre par le contrôle d’info-bulle à l’aide de l’un des deux styles de placement :

  • Par défaut, l’info-bulle s’affiche en regard de l’outil correspondant dans une position choisie par le contrôle. L’emplacement choisi est relatif aux coordonnées que vous fournissez à l’aide de ce message.
  • Si vous incluez la valeur TTF_ABSOLUTE dans le membre de la structure TOOLINFO , l’info-bulle s’affiche à l’emplacement de pixel spécifié dans le message. Dans ce cas, le contrôle ne tente pas de modifier l’emplacement de la fenêtre d’info-bulle à partir des coordonnées que vous fournissez.

Bon à savoir

Technologies

Prérequis

  • C/C++
  • Programmation de l’interface utilisateur Windows

Instructions

Implémenter des info-bulles In-Place

Le membre uFlags de la structure TOOLINFO utilisé dans l’exemple inclut l’indicateur TTF_ABSOLUTE . Sans cet indicateur, le contrôle d’info-bulle choisit l’emplacement d’affichage de l’info-bulle, et sa position par rapport à la boîte de dialogue peut changer soudainement à mesure que le pointeur de la souris se déplace.

Notes

g_toolItem est une structure TOOLINFO globale.

 

L’exemple suivant montre comment créer un contrôle d’info-bulle de suivi. L’exemple spécifie l’ensemble de la zone cliente de la fenêtre main en tant qu’outil.

HWND CreateTrackingToolTip(int toolID, HWND hDlg, WCHAR* pText)
{
    // Create a tooltip.
    HWND hwndTT = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, 
                                 WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, 
                                 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
                                 hDlg, NULL, g_hInst,NULL);

    if (!hwndTT)
    {
      return NULL;
    }

    // Set up the tool information. In this case, the "tool" is the entire parent window.
    
    g_toolItem.cbSize   = sizeof(TOOLINFO);
    g_toolItem.uFlags   = TTF_IDISHWND | TTF_TRACK | TTF_ABSOLUTE;
    g_toolItem.hwnd     = hDlg;
    g_toolItem.hinst    = g_hInst;
    g_toolItem.lpszText = pText;
    g_toolItem.uId      = (UINT_PTR)hDlg;
    
    GetClientRect (hDlg, &g_toolItem.rect);

    // Associate the tooltip with the tool window.
    
    SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &g_toolItem); 
    
    return hwndTT;
}
            

Implémentation de la procédure de fenêtre

Lorsque le pointeur de la souris se trouve dans la zone cliente, l’info-bulle est active et affiche les coordonnées du curseur, comme illustré dans l’illustration suivante.

capture d’écran d’une boîte de dialogue ; une info-bulle affiche les coordonnées x et y du pointeur de la souris

L’exemple de code suivant provient de la procédure de fenêtre d’une boîte de dialogue qui affiche l’info-bulle de suivi créée dans l’exemple précédent. La variable booléenne globale g_TrackingMouse est utilisée pour déterminer s’il est nécessaire de réactiver l’info-bulle et de réinitialiser le suivi de la souris afin que l’application soit avertie lorsque le pointeur de la souris quitte la zone cliente de la boîte de dialogue.

//g_hwndTrackingTT is a global HWND variable

case WM_INITDIALOG:

        InitCommonControls();
        g_hwndTrackingTT = CreateTrackingToolTip(IDC_BUTTON1, hDlg, L"");
        return TRUE;

case WM_MOUSELEAVE: // The mouse pointer has left our window. Deactivate the tooltip.
    
    SendMessage(g_hwndTrackingTT, TTM_TRACKACTIVATE, (WPARAM)FALSE, (LPARAM)&g_toolItem);
    g_TrackingMouse = FALSE;
    return FALSE;

case WM_MOUSEMOVE:

    static int oldX, oldY;
    int newX, newY;

    if (!g_TrackingMouse)   // The mouse has just entered the window.
    {                       // Request notification when the mouse leaves.
    
        TRACKMOUSEEVENT tme = { sizeof(TRACKMOUSEEVENT) };
        tme.hwndTrack       = hDlg;
        tme.dwFlags         = TME_LEAVE;
        
        TrackMouseEvent(&tme);

        // Activate the tooltip.
        SendMessage(g_hwndTrackingTT, TTM_TRACKACTIVATE, (WPARAM)TRUE, (LPARAM)&g_toolItem);
        
        g_TrackingMouse = TRUE;
    }

    newX = GET_X_LPARAM(lParam);
    newY = GET_Y_LPARAM(lParam);

    // Make sure the mouse has actually moved. The presence of the tooltip 
    // causes Windows to send the message continuously.
    
    if ((newX != oldX) || (newY != oldY))
    {
        oldX = newX;
        oldY = newY;
            
        // Update the text.
        WCHAR coords[12];
        swprintf_s(coords, ARRAYSIZE(coords), L"%d, %d", newX, newY);
        
        g_toolItem.lpszText = coords;
        SendMessage(g_hwndTrackingTT, TTM_SETTOOLINFO, 0, (LPARAM)&g_toolItem);

        // Position the tooltip. The coordinates are adjusted so that the tooltip does not overlap the mouse pointer.
        
        POINT pt = { newX, newY }; 
        ClientToScreen(hDlg, &pt);
        SendMessage(g_hwndTrackingTT, TTM_TRACKPOSITION, 0, (LPARAM)MAKELONG(pt.x + 10, pt.y - 20));
    }
    return FALSE;

Utilisation de contrôles d’info-bulle