Condividi tramite


Come implementare i tooltip In-Place

I tooltip in-loco vengono usati per mostrare testo per gli oggetti che sono stati ritagliati. Per un'illustrazione, vedere Informazioni sui controlli descrizione comando.

La differenza tra le descrizioni comando ordinarie e quelle sul posto è il posizionamento. Per impostazione predefinita, quando il puntatore del mouse passa sopra un'area con una descrizione comando associata, la descrizione comando viene visualizzata accanto all'area. Tuttavia, le descrizioni comando sono finestre e possono essere posizionate in qualsiasi posizione tu scelga chiamando SetWindowPos. La creazione di una descrizione comando sul posto è una questione di posizionamento della finestra della descrizione comando in modo che sovrappone la stringa di testo.

Cosa è necessario sapere

Tecnologie

Prerequisiti

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

Disposizioni

Posizionamento di un tooltip In-Place

È necessario tenere traccia di tre rettangoli quando si posiziona un tooltip direttamente:

  1. Rettangolo che circonda il testo completo dell'etichetta.
  2. Rettangolo che circonda il testo della descrizione comando. Il testo della descrizione comando è identico al testo completo dell'etichetta e in genere corrisponde alla stessa dimensione e carattere. I due rettangoli di testo saranno in genere le stesse dimensioni.
  3. Il rettangolo della finestra del suggerimento. Questo rettangolo è leggermente più grande del rettangolo di testo tooltip che racchiude.

I tre rettangoli sono illustrati schemamente nella figura seguente. La parte nascosta del testo dell'etichetta è indicata da uno sfondo grigio.

diagramma che mostra una stringa lunga, metà della quale ha uno sfondo grigio, quindi la stessa stringa all'interno di un rettangolo della finestra della descrizione comando più grande

Per creare una descrizione comando sul posto, è necessario posizionare il rettangolo di testo della descrizione comando in modo che sovrapponga il rettangolo di testo dell'etichetta. La procedura per allineare i due rettangoli è relativamente semplice:

  1. Definire il rettangolo di testo dell'etichetta.
  2. Posizionare la finestra della descrizione comando in modo che il rettangolo di testo della descrizione comando sovrappone il rettangolo di testo dell'etichetta.

In pratica, in genere è sufficiente allineare l'angolo superiore sinistro dei due rettangoli di testo. Il tentativo di ridimensionare il rettangolo di testo della descrizione comando in modo che corrisponda esattamente al rettangolo di testo dell'etichetta potrebbe causare problemi con la visualizzazione della descrizione comando.

Il problema con questo semplice schema è che non è possibile posizionare direttamente il rettangolo di testo della descrizione comando. È invece necessario posizionare il rettangolo della finestra della descrizione comando sufficientemente sopra e a sinistra del rettangolo di testo dell'etichetta in modo che gli angoli dei due rettangoli di testo coincidano. In altre parole, è necessario conoscere l'offset tra il rettangolo della finestra della descrizione comando e il rettangolo di testo racchiuso dalla stessa. In generale, non esiste un modo semplice per determinare questo offset.

Implementare In-Place suggerimenti

Il seguente frammento di codice illustra come utilizzare un messaggio TTM_ADJUSTRECT in un gestore TTN_SHOW per visualizzare un tooltip sul posto. L'applicazione indica che il testo dell'etichetta viene troncato impostando la variabile privata fMyStringIsTruncated su TRUE. Il gestore chiama una funzione definita dall'applicazione, GetMyItemRect, per recuperare il rettangolo di testo dell'etichetta. Questo rettangolo viene passato al controllo descrizione comando con TTM_ADJUSTRECT, che restituisce il rettangolo della finestra corrispondente. SetWindowPos viene quindi chiamato per posizionare il suggerimento sull'etichetta.

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

Questo esempio non modifica le dimensioni della descrizione comando, ma solo la relativa posizione. I due rettangoli di testo sono allineati agli angoli superiori sinistro, ma non necessariamente con le stesse dimensioni. In pratica, la differenza è in genere piccola e questo approccio è consigliato per la maggior parte degli scopi. Sebbene sia possibile, in linea di principio, usare SetWindowPos per ridimensionare e riposizionare la descrizione comando, farlo potrebbe causare conseguenze imprevedibili.

Osservazioni

I controlli comuni versione 5.80 semplificano l'uso delle descrizioni comando direttamente mediante l'aggiunta di un nuovo messaggio TTM_ADJUSTRECT. Invia questo messaggio con le coordinate del rettangolo del testo dell'etichetta su cui vuoi sovrapporre la descrizione comando, e ti verranno restituite le coordinate di un rettangolo della finestra della descrizione comando posizionato in modo appropriato.

Uso dei Controlli ToolTip