Come implementare descrizioni comandi sul posto

Le descrizioni comando sul posto vengono usate per visualizzare stringhe di testo per gli oggetti ritagliati. Per un'illustrazione, vedere Informazioni sui controlli descrizione comando.

La differenza tra le descrizioni comando normali e 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 adiacente all'area. Tuttavia, le descrizioni comando sono finestre e possono essere posizionate in qualsiasi punto scelto 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.

Informazioni importanti

Tecnologie

Prerequisiti

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

Istruzioni

Posizionamento di una descrizione comando sul posto

È necessario tenere traccia di tre rettangoli quando si posiziona una descrizione comando sul posto:

  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. Rettangolo della finestra della descrizione comando. Questo rettangolo è leggermente più grande del rettangolo di testo della descrizione comando che racchiude.

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

diagram showing a long string, half of which has a gray background, then the same string within a larger tooltip window rectangle

Per creare una descrizione comando sul posto, è necessario posizionare il rettangolo di testo della descrizione comando in modo che sovrappone 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 appena sopra e a sinistra del rettangolo di testo dell'etichetta in modo che gli angoli dei due rettangoli di testo coincidono. In altre parole, è necessario conoscere l'offset tra il rettangolo della finestra della descrizione comando e il relativo rettangolo di testo racchiuso. In generale, non esiste un modo semplice per determinare questo offset.

Implementare descrizioni comando sul posto

Il frammento di codice seguente illustra come usare un messaggio TTM_ADJUSTRECT in un gestore TTN_SHOW per visualizzare una descrizione comando 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 la descrizione comando 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, in questo modo potrebbe avere conseguenze imprevedibili.

Osservazioni:

I controlli comuni versione 5.80 semplificano l'uso di descrizioni comando sul posto mediante l'aggiunta di un nuovo messaggio, TTM_ADJUSTRECT. Inviare questo messaggio con le coordinate del rettangolo di testo dell'etichetta che si desidera sovrapporre alla descrizione comando e restituisce le coordinate di un rettangolo della finestra della descrizione comando posizionato in modo appropriato.

Uso dei controlli descrizione comando