Come creare una barra dei menu di tipo Internet Explorer

A prima vista, la barra dei menu in Microsoft Internet Explorer 5 e versioni successive è simile a un menu standard. Tuttavia, sembra molto diverso quando si inizia a usarlo.

La schermata seguente mostra la barra dei menu di Windows Internet Explorer con il menu Strumenti selezionato.

screen shot that shows the windows internet explorer menu bar, with the tools menu selected

La barra dei menu è in realtà un controllo barra degli strumenti simile a un menu standard. Anziché le voci di menu di primo livello, una barra dei menu include una serie di pulsanti di sola testo che visualizzano un menu a discesa quando si fa clic. Tuttavia, come tipo specializzato di barra degli strumenti, una barra dei menu ha alcune funzionalità che mancano i menu standard:

  • Può essere personalizzato usando tecniche standard della barra degli strumenti, consentendo all'utente di spostare, eliminare o aggiungere elementi.
  • Può avere il rilevamento ad accesso frequente, in modo che gli utenti sappiano quando si trovano su un elemento di primo livello senza dover prima fare clic su di esso.

Una barra dei menu può essere incorporata in un controllo rebar, fornendo le funzionalità seguenti:

  • Può avere un gripper, che consente all'utente di spostare o ridimensionare la banda.
  • Può condividere una striscia nel controllo rebar con altre bande, ad esempio la barra degli strumenti standard nella figura precedente.
  • Può visualizzare una freccia di espansione quando è coperta da una banda adiacente, dando all'utente l'accesso agli elementi nascosti.
  • Può avere una bitmap di sfondo definita dall'applicazione.

In questo argomento viene illustrato come implementare una barra dei menu. Poiché una barra dei menu è un'implementazione specializzata di un controllo barra degli strumenti, lo stato attivo sarà sugli argomenti specifici delle barre dei menu. Per informazioni su come incorporare una barra degli strumenti in un controllo rebar, vedere How to Create an Internet Explorer-Style Toolbar and About Rebar Controls.For a discussion about a toolbar in a rebar control, see How to Create an Internet Explorer-Style Toolbar and About Rebar Controls.

Creazione di una barra degli strumenti in una barra dei menu

Per rendere una barra degli strumenti in una barra dei menu:

  • Creare una barra degli strumenti piatta includendo TBSTYLE_FLAT con gli altri flag di stile finestra. Lo stile TBSTYLE_FLAT abilita anche il rilevamento rapido. Con questo stile, la barra dei menu è simile a un menu standard fino a quando l'utente non attiva un pulsante. Quindi, il pulsante sembra distinguersi dalla barra degli strumenti e deprimere quando viene fatto clic, proprio come un pulsante standard. Poiché il rilevamento rapido è abilitato, tutto ciò che è necessario per attivare un pulsante è che il cursore venga posizionato sopra di esso. Se il cursore si sposta su un altro pulsante, verrà attivato e il pulsante precedente verrà disattivato.
  • Creare pulsanti in stile elenco includendo TBSTYLE_LIST con gli altri flag di stile finestra. Questo stile crea un pulsante più sottile che assomiglia a una voce di menu di primo livello standard.
  • Rendere i pulsanti solo testo impostando il membro iBitmap della struttura TBBUTTON del pulsante su I_IMAGENONE e sul membro iString sul testo del pulsante.
  • Assegnare a ogni pulsante lo stile di BTNS_DROPDOWN . Quando si fa clic sul pulsante, il controllo barra degli strumenti invia all'applicazione una notifica di TBN_DROPDOWN per chiederlo di visualizzare il menu del pulsante.
  • Incorporare la barra dei menu in una barra di ribar. Abilitare entrambi i gripper e le frecce, come illustrato in Come creare una barra degli strumenti di tipo Internet Explorer.
  • Implementare un gestore TBN_DROPDOWN per visualizzare il menu a discesa del pulsante quando viene selezionato. Il menu a discesa è un tipo di menu a comparsa. Viene creato usando la funzione TrackPopupMenu , con l'angolo superiore sinistro allineato all'angolo inferiore sinistro del pulsante.
  • Implementare lo spostamento tramite tastiera, in modo che la barra dei menu sia completamente accessibile senza un mouse.
  • Implementare il rilevamento rapido dei menu. Con i menu standard, una volta visualizzato un menu di primo livello, lo spostamento del cursore su un'altra voce di primo livello visualizza automaticamente il relativo menu e comprime il menu della voce precedente. Il controllo barra degli strumenti tiene traccia del cursore e modifica l'immagine del pulsante, ma visualizza automaticamente il nuovo menu. L'applicazione deve farlo in modo esplicito.

La maggior parte di questi elementi è semplice da implementare e viene discussa altrove. Vedere How to Create an Internet Explorer-Style Toolbar, About Toolbar Controls, or About Rebar Controls for a general discussion of how to use toolbars and rebar controls.See How to Create an Internet Explorer-Style Toolbar, About Toolbar Controls, or About Rebar Controls for a general discussion of how to use toolbars and rebar controls. Per informazioni su come gestire i menu a comparsa, vedere Menu . I due elementi finali, lo spostamento tramite tastiera e il rilevamento rapido dei menu, sono illustrati nella parte restante di questo argomento.

Gestione dello spostamento con il menu Rilevamento rapido disabilitato

Gli utenti possono scegliere di spostarsi nella barra dei menu con il mouse, la tastiera o una combinazione di entrambi. Per implementare lo spostamento tramite barra dei menu, l'applicazione deve gestire le notifiche della barra degli strumenti e monitorare il mouse e la tastiera. Questa attività può essere suddivisa in due parti distinte: con e senza rilevamento rapido dei menu. Questa sezione illustra come gestire lo spostamento quando non vengono visualizzati menu e il rilevamento rapido dei menu non è abilitato.

Spostamento tramite mouse

Se il rilevamento rapido del menu è disabilitato, è possibile considerare una barra dei menu come una barra degli strumenti normale. Se l'utente sta passando con un mouse, tutte le applicazioni devono eseguire è gestire la notifica TBN_DROPDOWN . Quando questa notifica viene ricevuta, visualizzare il menu a discesa appropriato e abilitare il rilevamento rapido dei menu. Da allora, si è nel regime di rilevamento rapido del menu discusso in Gestione spostamento con Menu hot-Tracking abilitato.

Come illustrato in Spostamento misto, è anche necessario gestire la notifica TBN_HOTITEMCHANGE per tenere traccia del pulsante attivo. Questa notifica è irrilevante se l'utente si sposta solo con il mouse, ma è necessario quando lo spostamento tramite mouse e tastiera sono misti.

Spostamento tramite tastiera

Come indicato nella sezione precedente, l'utente può eseguire una serie di operazioni di spostamento con la tastiera quando il rilevamento rapido del menu è disabilitato. I controlli barra degli strumenti supportano lo spostamento tramite tastiera solo se hanno lo stato attivo. Inoltre, non gestiscono tutti i tasti necessari per le barre dei menu. La soluzione più semplice per gestire lo spostamento tramite tastiera consiste nell'elaborare in modo esplicito gli eventi di pressione dei tasti pertinenti.

Se il rilevamento rapido del menu è disabilitato, l'applicazione deve gestire questi eventi di pressione dei tasti nel modo seguente:

  • Tasto F10. Attivare il primo pulsante con TB_edizione Standard THOTITEM.
  • I tasti FRECCIA SINISTRA e FRECCIA DESTRA. Attivare il pulsante adiacente con TB_edizione Standard THOTITEM. Se l'utente tenta di spostarsi all'esterno di una delle due estremità della barra dei menu, attivare il primo pulsante alla fine opposta.
  • Tasto ESCAPE. Disattivare il pulsante attivo con TB_edizione Standard THOTITEM. La barra dei menu deve essere restituita allo stato precedente all'attivazione del primo pulsante.
  • Tasto di scelta rapida ALT. Usare il messaggio TB_MAPACCELERATOR per determinare il pulsante a cui corrisponde il carattere chiave . Visualizzare il menu a discesa del pulsante e abilitare il rilevamento rapido dei menu.
  • Tasto freccia GIÙ. Se un pulsante è attivo ma non è stato visualizzato alcun menu, visualizzare il menu del pulsante e abilitare il rilevamento rapido del menu.
  • Tasto INVIO. Disattivare il pulsante attivo con TB_edizione Standard THOTITEM. La barra dei menu deve essere restituita allo stato precedente all'attivazione del primo pulsante.

Spostamento misto

I gestori di spostamento tramite tastiera descritti nella sezione precedente eseguono fondamentalmente due attività: tenere traccia del pulsante attivo e visualizzare il menu appropriato quando viene selezionato un pulsante. Questi gestori sono sufficienti finché l'utente si sposta solo con la tastiera. Tuttavia, gli utenti spesso combinano la tastiera e lo spostamento con il mouse. Ad esempio, potrebbero attivare il primo pulsante con il tasto F10, usare il mouse per attivare un pulsante diverso e quindi aprire il menu con il tasto FRECCIA GIÙ. Se si preme solo il tasto di monitoraggio per tenere traccia del tasto attivo, verrà visualizzato il menu errato. È inoltre necessario gestire la notifica TBN_HOTITEMCHANGE per tenere traccia accuratamente del pulsante attivo.

Gestione dello spostamento con menu Attivato rilevamento rapido

Quando il rilevamento rapido del menu è abilitato, l'applicazione deve modificare il modo in cui risponde all'esplorazione dell'utente. Per replicare il comportamento dei menu standard, è necessario implementare in modo esplicito le funzionalità seguenti.

Con lo spostamento tramite mouse:

  • Se l'utente sposta il cursore su un altro pulsante, viene visualizzato immediatamente il menu precedente e il menu precedente scompare.
  • Il rilevamento rapido dei menu rimane attivo finché l'utente non seleziona un comando o fa clic su un punto che non fa parte dell'area del menu. Entrambe le azioni disattivano il rilevamento rapido del menu fino a quando non viene fatto clic su un altro pulsante.
  • Se il cursore si sposta dal menu, il menu a discesa corrente rimane fino a quando il cursore non si sposta nuovamente su o l'utente fa clic su un punto esterno, l'area coperta dal menu. Se il cursore torna a un pulsante diverso da quello attualmente visualizzato, il menu precedente viene compresso e viene visualizzato il nuovo menu.

Con lo spostamento tramite tastiera:

  • Il tasto FRECCIA DESTRA sposta lo stato attivo a destra. Se l'elemento ha un sottomenu, visualizzare il sottomenu. Se l'elemento non dispone di un sottomenu, comprimere il menu e qualsiasi sottomenu, attivare il pulsante successivo con TB_edizione Standard THOTITEM e visualizzare il menu per il pulsante adiacente. Se l'ultimo pulsante è attivo quando viene ricevuto questo messaggio, visualizzare il menu per il primo pulsante.

  • Il tasto FRECCIA SINISTRA sposta lo stato attivo a sinistra. Se l'elemento è un sottomenu, comprimerlo e spostare lo stato attivo sul relativo menu padre. Se l'elemento non è un sottomenu, comprimere il menu, attivare il pulsante successivo con TB_edizione Standard THOTITEM e visualizzare il menu per tale pulsante.

  • Il tasto ESCAPE supporta la visualizzazione di un passaggio.

    • Se viene visualizzato un sottomenu, viene compresso e lo stato attivo passa al menu padre.
    • Se viene visualizzato il menu di un pulsante, viene compresso e il rilevamento rapido del menu è disabilitato. Il pulsante dell'elemento rimane attivo.
    • Se non vengono visualizzati menu ma è attivo un pulsante, il pulsante viene disattivato e il rilevamento rapido dei menu è disabilitato.
  • I tasti FRECCIA SU e FRECCIA GIÙ vengono usati solo per spostarsi all'interno di un menu specifico.

  • Il tasto INVIO avvia il comando associato a una voce di menu. Se la voce di menu ha un sottomenu, viene visualizzata la chiave INVIO.

Come nel caso del rilevamento rapido del menu disabilitato, l'applicazione deve essere in grado di gestire mouse, tastiera e spostamento misto. Tuttavia, il fatto che viene visualizzato un menu significa che la messaggistica dovrà essere gestita in modo leggermente diverso.

Elaborazione dei messaggi per il rilevamento rapido dei menu

Il rilevamento rapido dei menu richiede che un menu venga visualizzato sempre, a parte l'intervallo breve necessario per passare a un nuovo menu. Tuttavia, il menu a discesa visualizzato da TrackPopupMenu è modale. L'applicazione continuerà a ricevere alcuni messaggi direttamente, tra cui WM_COMMAND, TBN_HOTITEMCHANGE e normali messaggi correlati al menu, ad esempio WM_MENUedizione Standard LECT. Tuttavia, non riceverà direttamente messaggi di tastiera o mouse di basso livello. Per gestire messaggi come WM_MOUedizione Standard MOVE, è necessario impostare un hook di messaggi per intercettare i messaggi indirizzati al menu.

Quando viene visualizzato un menu a discesa, impostare l'hook del messaggio chiamando la funzione SetWindowsHookEx con il parametro idHook impostato su WH_MSGFILTER. Tutti i messaggi destinati al menu verranno passati a MessageProc. Ad esempio, il frammento di codice seguente imposta un hook di messaggi che intercettare i messaggi che verranno visualizzati in un menu a discesa. MsgHook è il nome della routine hook ed hhookMsg è l'handle della routine.

hhookMsg = SetWindowsHookEx(WH_MSGFILTER, MsgHook, HINST_THISDLL, 0);

I messaggi di menu vengono identificati impostando il parametro nCode della routine hook su MSGF_MENU. Il parametro lParam punterà a una struttura MSG con il messaggio. Informazioni dettagliate sui messaggi da gestire e su come vengono illustrati nella parte restante di questo argomento.

L'applicazione deve passare tutti i messaggi all'hook del messaggio successivo chiamando la funzione CallNextHookEx. È inoltre necessario inviare messaggi del mouse direttamente al controllo barra degli strumenti, assicurandosi di convertire qualsiasi coordinata punto nello spazio delle coordinate client della barra degli strumenti. L'invio diretto dei messaggi garantisce che il controllo della barra degli strumenti riceva i messaggi del mouse appropriati. Ad esempio, la barra degli strumenti deve ricevere messaggi WM_MOUedizione Standard MOVE per tenere traccia dei pulsanti.

Quando viene attivato un nuovo pulsante, l'applicazione deve comprimere il menu a discesa precedente con un messaggio di WM_CANCELMODE e visualizzare un nuovo menu. Deve anche comprimere il menu a discesa quando lo stato attivo viene preso dalla barra dei menu con lo spostamento tramite tastiera o facendo clic all'esterno dell'area del menu. Ogni volta che si comprime un menu, è necessario liberarne l'hook tramite la funzione UnhookWindowsHookEx. Se è necessario visualizzare un altro menu a discesa, creare un nuovo hook di messaggi. Quando viene avviato un comando, il menu verrà compresso automaticamente, ma è necessario liberare in modo esplicito l'hook del messaggio.

Nell'esempio di codice seguente viene liberato l'hook del messaggio impostato nell'esempio precedente.

UnhookWindowsHookEx(hhookMsg);

Spostamento tramite mouse

Quando un normale controllo barra degli strumenti tiene traccia dei pulsanti, evidenzia il pulsante attivo e invia all'applicazione una notifica TBN_HOTITEMCHANGE ogni volta che viene attivato un nuovo pulsante. L'applicazione è responsabile della visualizzazione del menu a discesa appropriato. Deve:

  • Gestire la notifica TBN_HOTITEMCHANGE per tenere traccia del pulsante attivo. Quando il pulsante attivo cambia, comprimere il menu precedente e crearne uno nuovo.
  • Gestire la notifica TBN_DROPDOWN inviata quando si fa clic su un pulsante. Dovrebbe quindi comprimere il menu e disabilitare il rilevamento rapido del menu. Il pulsante rimane attivo.
  • Gestire i messaggi WM_LBUTTONDOWN, WM_RBUTTONDOWN e WM_MOUedizione Standard MOVE nella procedura di hook dei messaggi per tenere traccia della posizione del mouse. Se il mouse viene selezionato all'esterno dell'area del menu, comprimere il menu a discesa corrente, disattivare il rilevamento rapido del menu e restituire la barra dei menu al relativo stato di preattivazione.
  • Quando viene avviato un comando di menu, disabilitare il rilevamento rapido dei menu. Il menu verrà compresso automaticamente, ma è necessario liberare in modo esplicito l'hook del messaggio.

È inoltre necessario gestire la messaggistica correlata al menu, ad esempio il messaggio WM_INITMENUPOPUP inviato quando una voce di menu deve visualizzare un sottomenu. Per informazioni su come gestire tali messaggi, vedere Menu.

Spostamento tramite tastiera

L'applicazione deve elaborare i messaggi da tastiera nella procedura di hook dei messaggi e agire su quelli che influiscono sul rilevamento rapido dei menu. È necessario gestire i tasti seguenti:

  • Tasto ESCAPE. Il tasto ESCAPE esegue il backup dello schermo su un livello. Se viene visualizzato un sottomenu, è necessario comprimerlo. Se viene visualizzato il menu principale di un pulsante, comprimerlo e disabilitare il rilevamento rapido dei menu. Il pulsante rimane attivo.
  • Tasto freccia DESTRA. Se l'elemento ha un sottomenu, visualizzarlo. Se l'elemento non dispone di un sottomenu, comprimere il menu e qualsiasi sottomenu, attivare il pulsante successivo con TB_edizione Standard THOTITEM e visualizzarne il menu. Se l'ultimo pulsante è stato attivo quando è stata ricevuta questa notifica, visualizzare il menu per il primo pulsante.
  • Tasto freccia SINISTRA. Se l'elemento si trova in un sottomenu, comprimerlo e spostare lo stato attivo sul relativo menu padre. Se l'elemento non è un sottomenu, comprimere il menu, attivare il pulsante adiacente con TB_edizione Standard THOTITEM e visualizzarne il menu. Se il primo pulsante è stato attivo quando è stata ricevuta questa notifica, visualizzare il menu per l'ultimo pulsante.
  • I tasti FRECCIA SU e FRECCIA GIÙ. Questi tasti vengono usati per spostarsi all'interno di un menu, ma non influiscono direttamente sul rilevamento rapido del menu.
  • Tasto di scelta rapida ALT. Usare il messaggio TB_MAPACCELERATOR per determinare il pulsante a cui corrisponde il carattere chiave . Se corrisponde a un pulsante diverso da quello attualmente attivo, comprimere il menu a discesa corrente, attivare il nuovo pulsante con TB_edizione Standard THOTITEM e visualizzare il menu per il pulsante adiacente. Se il carattere Chiave corrisponde al pulsante attualmente visualizzato, comprimere il menu a discesa e disabilitare il rilevamento rapido del menu. Il pulsante deve rimanere attivo.