Condividi tramite


Come implementare i tooltip di tracciamento

I tooltips rimangono visibili finché non vengono chiusi in modo esplicito dall'applicazione e possono cambiare posizione sullo schermo dinamicamente. Sono supportati da versione 4.70 e versioni successive dei controlli comuni.

Per creare una descrizione comando di rilevamento, includere il flag TTF_TRACK nel uFlags membro della strutturaTOOLINFOquando si invia il messaggio di TTM_ADDTOOL.

L'applicazione deve attivare manualmente (mostrare) e disattivare (nascondere) un tooltip di monitoraggio inviando un messaggio di TTM_TRACKACTIVATE. Mentre è attiva una descrizione comando di rilevamento, l'applicazione deve specificare il percorso della descrizione comando inviando TTM_TRACKPOSITION messaggi al controllo descrizione comando. Poiché l'applicazione gestisce attività come il posizionamento della descrizione comando, le descrizioni comando di tracciamento non usano il flag TTF_SUBCLASS o il messaggio TTM_RELAYEVENT.

Il messaggio TTM_TRACKPOSITION fa sì che il controllo tooltip visualizzi la finestra usando uno dei due stili di posizionamento:

  • Per impostazione predefinita, la descrizione comando viene visualizzata accanto allo strumento corrispondente in una posizione selezionata dal controllo. La posizione scelta è relativa alle coordinate fornite usando questo messaggio.
  • Se si include il valore TTF_ABSOLUTE nell'elemento della struttura TOOLINFO, la descrizione comando viene visualizzata nella posizione in pixel specificata nel messaggio. In questo caso, il controllo non tenta di modificare la posizione della finestra della descrizione comando dalle coordinate che fornisci tu.

Cosa è necessario sapere

Tecnologie

Prerequisiti

  • C/C++
  • Programmazione dell'interfaccia utente di Windows

Disposizioni

Implementare In-Place tooltip

Il uFlags membro della struttura TOOLINFO utilizzata nell'esempio include il flag TTF_ABSOLUTE. Senza questo flag, il controllo descrizione comando sceglie dove visualizzare la descrizione comando e la relativa posizione relativa alla finestra di dialogo può cambiare improvvisamente quando si sposta il puntatore del mouse.

Nota

g_toolItem è una struttura globale TOOLINFO.

 

Nell'esempio seguente viene illustrato come creare un controllo descrizione comando di rilevamento. Nell'esempio viene specificata l'intera area client della finestra principale come strumento.

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;
}
            

Implementazione della Procedura di Finestra

Quando il puntatore del mouse si trova nell'area del cliente, la descrizione comando è attiva e visualizza le coordinate del cursore, come illustrato nella figura seguente.

screenshot di una finestra di dialogo; una descrizione comando mostra le coordinate x e y del puntatore del mouse

Il codice di esempio seguente proviene dalla procedura della finestra per una finestra di dialogo che visualizza il tooltip di tracciamento creato nell'esempio precedente. La variabile booleana globale g_TrackingMouse viene usata per determinare se è necessario riattivare la descrizione comando e reimpostare il rilevamento del mouse in modo che l'applicazione venga notificata quando il puntatore del mouse esce dall'area client della finestra di dialogo.

//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;

Utilizzo dei controlli tooltip