Come implementare le descrizioni comando di rilevamento

Le descrizioni comando di rilevamento rimangono visibili finché non vengono chiuse in modo esplicito dall'applicazione e possono modificare la posizione sullo schermo in modo dinamico. Sono supportate dalla versione 4.70 e successive dei controlli comuni.

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

L'applicazione deve attivare manualmente (mostrare) e disattivare (nascondere) una descrizione comando di rilevamento 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 rilevamento non usano il flag TTF_SUBCLASS o il messaggio di TTM_RELAYEVENT .

Il messaggio TTM_TRACKPOSITION fa sì che il controllo descrizione comando 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 nel membro 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 fornite.

Informazioni importanti

Tecnologie

Prerequisiti

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

Istruzioni

Implementare descrizioni comando sul posto

Il membro uFlags della struttura TOOLINFO utilizzato 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 TOOLINFO globale.

 

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 finestra

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

screen shot of a dialog box; a tooltip shows the x and y coordinates of the mouse pointer

Il codice di esempio seguente proviene dalla routine della finestra per una finestra di dialogo che visualizza la descrizione comando di rilevamento creata 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 lascia l'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;

Uso dei controlli descrizione comando