Informazioni sui menu
Un menu è un elenco di voci che specificano opzioni o gruppi di opzioni (un sottomenu) per un'applicazione. Se si fa clic su una voce di menu, viene aperto un sottomenu oppure l'applicazione esegue un comando. In questa sezione vengono fornite informazioni sugli argomenti seguenti:
- Menu e barre dei menu
- Accesso tramite tastiera ai menu
- Creazione menu
- Voci di menu
- Elementi ed elementi di comando che aprono sottomenu
- Identificatore voce di menu
- Posizione voce di menu
- Accesso a voci di menu a livello di codice
- Voci di menu predefinite
- Voci di menu selezionate e cancellate
- Voci di menu abilitate, disattivate e disabilitate
- Voci di menu evidenziate
- Voci di menu disegnate dal proprietario
- Separatori di voci di menu e interruzioni di riga
- Messaggi usati con i menu
- Distruzione menu
Menu e barre dei menu
Un menu è disposto in una gerarchia. Al livello superiore della gerarchia è la barra dei menu, che contiene un elenco di menu, che a sua volta può contenere sottomenu. Una barra dei menu è talvolta denominata menu di primo livello e i menu e i sottomenu sono noti anche come menu a comparsa.
Una voce di menu può eseguire un comando o aprire un sottomenu. Un elemento che esegue un comando è denominato elemento di comando o comando.
Una voce sulla barra dei menu apre quasi sempre un menu. Le barre dei menu contengono raramente elementi di comando. Un menu aperto dalla barra dei menu si abbassa dalla barra dei menu e a volte viene chiamato menu a discesa. Quando viene visualizzato un menu a discesa, viene collegato alla barra dei menu. Una voce di menu sulla barra dei menu che apre un menu a discesa è detta anche nome di menu.
I nomi dei menu in una barra dei menu rappresentano le categorie principali di comandi forniti da un'applicazione. La selezione di un nome di menu dalla barra dei menu apre in genere un menu le cui voci di menu corrispondono ai comandi di una categoria. Ad esempio, una barra dei menu potrebbe contenere un nome di menu File che, quando si fa clic dall'utente, attiva un menu con voci di menu come Nuovo, Apri e Salva. Per ottenere informazioni su una barra dei menu, chiama GetMenuBarInfo.
Solo una finestra sovrapposta o popup può contenere una barra dei menu; una finestra figlio non può contenere una finestra figlio. Se la finestra ha una barra del titolo, il sistema posiziona la barra dei menu appena sotto di essa. Una barra dei menu è sempre visibile. Un sottomenu non è tuttavia visibile fino a quando l'utente non seleziona una voce di menu che la attiva. Per altre informazioni sulle finestre sovrapposte e popup, vedere Tipi di finestra.
Ogni menu deve avere una finestra di proprietario. Il sistema invia messaggi alla finestra del proprietario di un menu quando l'utente seleziona il menu o sceglie una voce dal menu.
In questa sezione vengono illustrati gli argomenti seguenti.
Menu di scelta rapida
Il sistema fornisce anche menu di scelta rapida. Un menu di scelta rapida non è collegato alla barra dei menu; può essere visualizzato ovunque sullo schermo. Un'applicazione associa in genere un menu di scelta rapida a una parte di una finestra, ad esempio l'area client o a un oggetto specifico, ad esempio un'icona. Per questo motivo, questi menu sono chiamati anche menu di scelta rapida.
Un menu di scelta rapida rimane nascosto finché l'utente non lo attiva, in genere facendo clic con il pulsante destro del mouse su una selezione, una barra degli strumenti o un pulsante della barra delle applicazioni. Il menu viene in genere visualizzato nella posizione del cursore o del mouse.
Menu Finestra
Il menu Finestra (noto anche come menu Sistema o Menu Di controllo ) è un menu a comparsa definito e gestito quasi esclusivamente dal sistema operativo. L'utente può aprire il menu della finestra facendo clic sull'icona dell'applicazione sulla barra del titolo o facendo clic con il pulsante destro del mouse in un punto qualsiasi della barra del titolo.
Il menu Finestra fornisce un set standard di voci di menu che l'utente può scegliere di modificare le dimensioni o la posizione di una finestra o chiudere l'applicazione. Gli elementi del menu della finestra possono essere aggiunti, eliminati e modificati, ma la maggior parte delle applicazioni usa solo il set standard di voci di menu. Una finestra sovrapposta, popup o figlio può avere un menu finestra. Non è raro che una finestra popup o sovrapposta non includa un menu finestra.
Quando l'utente sceglie un comando dal menu Finestra , il sistema invia un messaggio WM_SYSCOMMAND alla finestra del proprietario del menu. Nella maggior parte delle applicazioni, la routine della finestra non elabora i messaggi dal menu della finestra. Passa invece semplicemente i messaggi alla funzione DefWindowProc per l'elaborazione predefinita del messaggio. Se un'applicazione aggiunge un comando al menu della finestra, la routine della finestra deve elaborare il comando.
Un'applicazione può usare la funzione GetSystemMenu per creare una copia del menu della finestra predefinita da modificare. Qualsiasi finestra che non usa la funzione GetSystemMenu per creare la propria copia del menu della finestra riceve il menu della finestra standard.
Identificatore della Guida
Associato a ogni barra dei menu, menu, sottomenu e menu di scelta rapida è un identificatore della Guida. Se l'utente preme il tasto F1 mentre il menu è attivo, questo valore viene inviato alla finestra del proprietario come parte di un messaggio di WM_HELP.
Accesso tramite tastiera ai menu
Il sistema fornisce un'interfaccia della tastiera standard per i menu. È possibile migliorare questa interfaccia fornendo tasti di scelta rapida e tasti di scelta rapida (acceleratore) per le voci di menu.
Gli argomenti seguenti descrivono l'interfaccia della tastiera standard, i tasti di scelta rapida e i tasti di scelta rapida:
Interfaccia della tastiera standard
Il sistema è progettato per funzionare con o senza un mouse o un altro dispositivo di puntamento. Poiché il sistema fornisce un'interfaccia della tastiera standard, l'utente può usare la tastiera per selezionare le voci di menu. Questa interfaccia della tastiera non richiede codice speciale. Un'applicazione riceve un messaggio di comando che indica se l'utente seleziona una voce di menu tramite la tastiera o tramite un mouse. L'interfaccia della tastiera standard elabora le sequenze di tasti seguenti.
Combinazioni di tasti | Azione |
---|---|
Carattere alfabetico | Seleziona la prima voce di menu con il carattere specificato come tasto di scelta. Se la voce selezionata richiama un menu, viene visualizzato il menu e la prima voce viene evidenziata. In caso contrario, viene scelta la voce di menu. |
ALT | Attiva e disattiva la modalità barra dei menu. |
ALT+BARRA SPAZIATRICE | Visualizza il menu della finestra. |
INVIO | Attiva un menu e seleziona la prima voce di menu se a una voce è associato un menu. In caso contrario, questa sequenza di tasti sceglie l'elemento come se l'utente rilasciasse il pulsante del mouse mentre l'elemento è stato selezionato. |
ESC | Esce dalla modalità menu. |
FRECCIA SINISTRA | Passa alla voce di menu di primo livello precedente. Le voci di menu di primo livello includono nomi di menu e menu della finestra. Se la voce selezionata si trova in un menu, la colonna precedente nel menu è selezionata o viene selezionata la voce di menu di primo livello precedente. |
FRECCIA DESTRA | Funziona come il tasto FRECCIA SINISTRA, tranne nella direzione opposta. Nei menu questa sequenza di tasti sposta in avanti una colonna; quando l'elemento attualmente selezionato si trova nella colonna all'estrema destra, viene selezionato il menu successivo. |
FRECCE SU o GIÙ | Attiva un menu quando viene premuto in un nome di menu. Quando viene premuto in un menu, il tasto FRECCIA SU seleziona l'elemento precedente; La sequenza di tasti FRECCIA GIÙ seleziona l'elemento successivo. |
Tasti di scelta del menu
L'interfaccia della tastiera standard per i menu può essere migliorata aggiungendo tasti di scelta (mnemonic) alle voci di menu. Un tasto di scelta è una lettera sottolineata nel testo di una voce di menu. Quando un menu è attivo, l'utente può selezionare una voce di menu premendo il tasto corrispondente alla lettera sottolineata dell'elemento. L'utente attiva la barra dei menu premendo ALT per evidenziare la prima voce sulla barra dei menu. Un menu è attivo quando viene visualizzato.
Per creare un tasto di scelta per una voce di menu, precedere qualsiasi carattere nella stringa di testo dell'elemento con un'e commerciale. Ad esempio, la stringa di testo "&Move" fa in modo che il sistema sottolinea la lettera "M".
Tasti di scelta rapida del menu
Oltre a disporre di un tasto di scelta, una voce di menu può avere un tasto di scelta rapida associato. Un tasto di scelta rapida è diverso da un tasto di scelta, perché il menu non deve essere attivo per il funzionamento del tasto di scelta rapida. Inoltre, un tasto di scelta è sempre associato a una voce di menu, mentre un tasto di scelta rapida è in genere (ma non deve essere) associato a una voce di menu.
Il testo che identifica il tasto di scelta rapida viene aggiunto alla stringa di testo della voce di menu. Il testo di scelta rapida viene visualizzato a destra del nome della voce di menu, dopo una barra rovesciata e un carattere di tabulazioni (\t). Ad esempio, "&Close\tAlt+F4" rappresenta un comando Close con la combinazione di tasti ALT+F4 come tasto di scelta rapida e con la lettera "C" come tasto di scelta rapida. Per altre informazioni, vedere Tasti di scelta rapida.
Creazione menu
È possibile creare un menu usando un modello di menu o funzioni di creazione di menu. I modelli di menu vengono in genere definiti come risorse. Le risorse modello di menu possono essere caricate in modo esplicito o assegnato come menu predefinito per una classe di finestra. È anche possibile creare risorse modello di menu in modo dinamico in memoria.
Gli argomenti seguenti descrivono in dettaglio la creazione di menu:
- Risorse modello menu
- Modello di menu in memoria
- Handle di menu
- Funzioni di creazione menu
- Visualizzazione menu
- Menu classi finestra
Risorse modello menu
La maggior parte delle applicazioni crea menu usando risorse del modello di menu. Un modello di menu definisce un menu, incluse le voci nella barra dei menu e tutti i menu. Per informazioni sulla creazione di una risorsa modello di menu, vedere la documentazione inclusa negli strumenti di sviluppo.
Dopo aver creato una risorsa modello di menu e aggiungerla al file eseguibile dell'applicazione (con estensione exe), è possibile usare la funzione LoadMenu per caricare la risorsa in memoria. Questa funzione restituisce un handle al menu, che è quindi possibile assegnare a una finestra usando la funzione SetMenu. È possibile assegnare un menu a qualsiasi finestra che non sia una finestra figlio.
L'implementazione di menu come risorse semplifica la localizzazione di un'applicazione per l'uso in più paesi/aree geografiche. Solo il file di definizione delle risorse deve essere localizzato per ogni lingua, non per il codice sorgente dell'applicazione.
Modello di menu in memoria
È possibile creare un menu da un modello di menu compilato in memoria in fase di esecuzione. Ad esempio, un'applicazione che consente a un utente di personalizzare il menu potrebbe creare un modello di menu in memoria in base alle preferenze dell'utente. L'applicazione potrebbe quindi salvare il modello in un file o nel Registro di sistema per un uso futuro. Per creare un menu da un modello in memoria, usare la funzione LoadMenuIndirect. Per le descrizioni dei formati dei modelli di menu, vedere Risorse modello di menu.
Un modello di menu standard è costituito da una struttura MENUITEMTEMPLATEHEADER seguita da una o più strutture MENUITEMTEMPLATE.
Un modello di menu esteso è costituito da una struttura MENUEX_TEMPLATE_HEADER seguita da una o più strutture MENUEX_TEMPLATE_ITEM.
Handle di menu
Il sistema genera un handle univoco per ogni menu. Un handle di menu è un valore del tipo HMENU . Un'applicazione deve specificare un handle di menu in molte delle funzioni di menu. Quando si crea il menu o si carica una risorsa di menu, si riceve un handle a una barra dei menu.
Per recuperare un handle sulla barra dei menu per un menu creato o caricato, utilizzare la funzione GetMenu. Per recuperare un handle al sottomenu associato a una voce di menu, utilizzare la funzione GetSubMenu o GetMenuItemInfo. Per recuperare un handle in un menu della finestra, usare la funzione GetSystemMenu.
Funzioni di creazione menu
Usando le funzioni di creazione di menu, è possibile creare menu in fase di esecuzione o aggiungere voci di menu ai menu esistenti. È possibile usare la funzione CreateMenu per creare una barra dei menu vuota e la funzione CreatePopupMenu per creare un menu vuoto. È possibile salvare determinate informazioni sulle impostazioni per un menu utilizzando la struttura MENUINFO. Per ottenere o recuperare le impostazioni di un menu, usare GetMenuInfo o SetMenuInfo. Per aggiungere voci a un menu, utilizzare la funzione InsertMenuItem. Le funzioni AppendMenu e InsertMenu meno recenti sono ancora supportate, ma insertMenuItem deve essere usato per le nuove applicazioni.
Visualizzazione menu
Dopo che un menu è stato caricato o creato, deve essere assegnato a una finestra prima che il sistema possa visualizzarlo. È possibile assegnare un menu definendo un menu di classe. Per altre informazioni, vedere Menu classi finestra. È anche possibile assegnare un menu a una finestra specificando un handle al menu come parametro hMenu della funzione CreateWindow o CreateWindowEx oppure chiamando la funzione SetMenu.
Per visualizzare un menu di scelta rapida, usare la funzione TrackPopupMenuEx. I menu di scelta rapida, detti anche menu a comparsa mobile o menu di scelta rapida, vengono in genere visualizzati quando viene elaborato il messaggio WM_CONTEXTMENU.
È possibile assegnare un menu a qualsiasi finestra che non sia una finestra figlio.
La funzione TrackPopupMenu precedente è ancora supportata, ma le nuove applicazioni devono usare la funzione TrackPopupMenuEx.
Menu classi finestra
È possibile specificare un menu predefinito, denominato menu di classe, quando si registra una classe di finestra. A tale scopo, assegnare il nome della risorsa menu-modello al membro lpszMenuName della struttura WNDCLASS usata per registrare la classe.
Per impostazione predefinita, a ogni finestra viene assegnato il menu classe per la relativa classe della finestra, quindi non è necessario caricare in modo esplicito il menu e assegnarlo a ogni finestra. È possibile eseguire l'override del menu della classe specificando un handle di menu diverso in una chiamata alla funzione CreateWindowEx. È anche possibile modificare il menu di una finestra dopo averlo creato usando la funzione SetMenu. Per altre informazioni, vedere Classi di finestre.
Voci di menu
Gli argomenti seguenti illustrano le operazioni del sistema quando l'utente sceglie una voce di menu e i modi in cui un'applicazione può controllare l'aspetto e le funzionalità di un elemento:
- Elementi ed elementi di comando che aprono sottomenu
- Identificatore voce di menu
- Posizione voce di menu
- Accesso a voci di menu a livello di codice
- Voci di menu predefinite
- Voci di menu selezionate e cancellate
- Voci di menu abilitate, disattivate e disabilitate
- Voci di menu evidenziate
- Voci di menu disegnate dal proprietario
- Separatori di voci di menu e interruzioni di riga
Elementi ed elementi di comando che aprono sottomenu
Quando l'utente sceglie un elemento di comando, il sistema invia un messaggio di comando alla finestra proprietaria del menu. Se la voce di comando si trova nel menu della finestra, il sistema invia il messaggio WM_SYSCOMMAND. In caso contrario, invia il messaggio di WM_COMMAND .
Associato a ogni voce di menu che apre un sottomenu è un handle per il sottomenu corrispondente. Quando l'utente punta a un elemento di questo tipo, il sistema apre il sottomenu. Nessun messaggio di comando viene inviato alla finestra del proprietario. Tuttavia, il sistema invia un messaggio di WM_INITMENUPOPUP alla finestra del proprietario prima di visualizzare il sottomenu. È possibile ottenere un handle per il sottomenu associato a un elemento usando la funzione GetSubMenu o GetMenuItemInfo.
Una barra dei menu contiene in genere nomi di menu, ma può contenere anche voci di comando. Un sottomenu contiene in genere elementi di comando, ma può anche contenere elementi che aprono sottomenu annidati. Aggiungendo tali elementi a sottomenu, è possibile annidare i menu a qualsiasi profondità. Per fornire un segnale visivo per l'utente, il sistema visualizza automaticamente una piccola freccia a destra del testo di una voce di menu che apre un sottomenu.
Identificatore voce di menu
Associato a ogni voce di menu è un intero univoco definito dall'applicazione, denominato identificatore di voce di menu. Quando l'utente sceglie una voce di comando da un menu, il sistema invia l'identificatore dell'elemento alla finestra del proprietario come parte di un messaggio di WM_COMMAND . La procedura della finestra esamina l'identificatore per determinare l'origine del messaggio ed elabora il messaggio di conseguenza. Inoltre, è possibile specificare una voce di menu usando il relativo identificatore quando si chiamano funzioni di menu; ad esempio, per abilitare o disabilitare una voce di menu.
Le voci di menu che aprono i sottomenu hanno identificatori esattamente come fanno gli elementi di comando. Tuttavia, il sistema non invia un messaggio di comando quando tale elemento viene selezionato da un menu. Il sistema apre invece il sottomenu associato alla voce di menu.
Per recuperare l'identificatore della voce di menu in una posizione specificata, usare la funzione GetMenuItemID o GetMenuItemInfo.
Posizione voce di menu
Oltre a avere un identificatore univoco, ogni voce di menu in una barra dei menu o in un menu ha un valore di posizione univoco. La voce più a sinistra in una barra dei menu, o la voce superiore di un menu, ha la posizione zero. Il valore della posizione viene incrementato per le voci di menu successive. Il sistema assegna un valore di posizione a tutte le voci di un menu, inclusi i separatori. La figura seguente mostra i valori di posizione delle voci in una barra dei menu e in un menu.
Quando si chiama una funzione di menu che modifica o recupera informazioni su una voce di menu specifica, è possibile specificare l'elemento usando il relativo identificatore o la relativa posizione. Per ulteriori informazioni, vedi la sezione successiva.
Accesso a voci di menu a livello di codice
La maggior parte delle funzioni di menu consente di specificare una voce di menu in base alla posizione o al comando. Alcune funzioni usano i flag MF_BYPOSITION e MF_BYCOMMAND per indicare l'algoritmo di ricerca; altri hanno un parametro fByPosition esplicito. Se si specifica la voce di menu in base alla posizione, il numero dell'elemento è un indice in base zero nel menu. Se si specifica la voce di menu in base al comando, il menu e i relativi sottomenu vengono cercati per una voce il cui identificatore di menu è uguale al numero di elemento specificato. Se più di una voce nella gerarchia di menu corrisponde al numero di elemento, non viene specificato quale elemento viene usato. Se i menu contengono identificatori di menu duplicati, è consigliabile usare operazioni di menu basate sulla posizione per evitare questa ambiguità.
Voci di menu predefinite
Un sottomenu può contenere una voce di menu predefinita. Quando l'utente apre un sottomenu facendo doppio clic, il sistema invia un messaggio di comando alla finestra del proprietario del menu e chiude il menu come se fosse stato scelto l'elemento di comando predefinito. Se non è presente alcun elemento di comando predefinito, il sottomenu rimane aperto. Per recuperare e impostare l'elemento predefinito per un sottomenu, usare le funzioni GetMenuDefaultItem e SetMenuDefaultItem.
Voci di menu selezionate e cancellate
Una voce di menu può essere selezionata o deselezionata. Il sistema visualizza una bitmap accanto alle voci di menu selezionate per indicare lo stato selezionato. Il sistema non visualizza una bitmap accanto a elementi cancellati, a meno che non venga specificata una bitmap "clear" definita dall'applicazione. È possibile selezionare solo le voci di menu in un menu; non è possibile selezionare le voci in una barra dei menu.
Le applicazioni in genere controllano o deselezionano una voce di menu per indicare se un'opzione è attiva. Si supponga, ad esempio, che un'applicazione disponga di una barra degli strumenti che l'utente può visualizzare o nascondere usando un comando Barra degli strumenti in un menu. Quando la barra degli strumenti è nascosta, la voce di menu Barra degli strumenti è deselezionata. Quando l'utente sceglie il comando, l'applicazione controlla la voce di menu e visualizza la barra degli strumenti.
Un attributo del segno di spunta controlla se è selezionata una voce di menu. È possibile impostare l'attributo del segno di spunta di una voce di menu usando la funzione CheckMenuItem. È possibile usare la funzione GetMenuState per determinare se una voce di menu è attualmente selezionata o deselezionata.
Anziché CheckMenuItem e GetMenuState, è possibile usare le funzioni GetMenuItemInfo e SetMenuItemInfo per recuperare e impostare lo stato di controllo di una voce di menu.
In alcuni casi, un gruppo di voci di menu corrisponde a un set di opzioni che si escludono a vicenda. In questo caso, è possibile indicare l'opzione selezionata usando una voce di menu di opzione selezionata (analogamente a un controllo pulsante di opzione). Gli elementi di opzione selezionati vengono visualizzati con una bitmap punto elenco anziché una bitmap del segno di spunta. Per controllare una voce di menu e impostarla come voce di opzione, usare la funzione CheckMenuRadioItem.
Per impostazione predefinita, il sistema visualizza un segno di spunta o una bitmap puntata accanto alle voci di menu selezionate e nessuna bitmap accanto alle voci di menu deselezionate. Tuttavia, è possibile usare la funzione SetMenuItemBitmaps per associare bitmap selezionate e deselezionate definite dall'applicazione a una voce di menu. Il sistema usa quindi le bitmap specificate per indicare lo stato selezionato o cancellato della voce di menu.
Le bitmap definite dall'applicazione associate a una voce di menu devono avere le stesse dimensioni della bitmap del segno di spunta predefinito, le cui dimensioni possono variare a seconda della risoluzione dello schermo. Per recuperare le dimensioni corrette, utilizzare la funzione GetSystemMetrics. È possibile creare più risorse bitmap per risoluzioni dello schermo diverse; creare una risorsa bitmap e ridimensionarla, se necessario; oppure creare una bitmap in fase di esecuzione e disegnare un'immagine. Le bitmap possono essere monocromatiche o colori. Tuttavia, poiché le voci di menu vengono invertite quando vengono evidenziate, l'aspetto di determinate bitmap di colore invertite può essere indesiderato. Per altre informazioni, vedere Bitmap.
Voci di menu abilitate, disattivate e disabilitate
Una voce di menu può essere abilitata, disattivata o disabilitata. Per impostazione predefinita, è abilitata una voce di menu. Quando l'utente sceglie una voce di menu abilitata, il sistema invia un messaggio di comando alla finestra del proprietario o visualizza il sottomenu corrispondente, a seconda del tipo di voce di menu.
Quando le voci di menu non sono disponibili per l'utente, devono essere disattivate o disattivate. Non è possibile scegliere voci di menu disattivate e disattivate. Un elemento disabilitato è simile a un elemento abilitato. Quando l'utente fa clic su un elemento disabilitato, l'elemento non viene selezionato e non accade nulla. Gli elementi disabilitati possono essere utili in, ad esempio, un'esercitazione che presenta un menu che sembra attivo ma non lo è.
Un'applicazione grigia una voce di menu non disponibile per fornire un segnale visivo all'utente che un comando non è disponibile. È possibile utilizzare un elemento in grigio quando un'azione non è appropriata (ad esempio, è possibile grigio il comando Stampa nel menu File quando il sistema non dispone di una stampante installata).
La funzione EnableMenuItem abilita, grigi o disabilita una voce di menu. Per determinare se una voce di menu è abilitata, disattivata o disabilitata, utilizzare la funzione GetMenuItemInfo.
Anziché GetMenuItemInfo, è anche possibile usare la funzione GetMenuState per determinare se una voce di menu è abilitata, disattivata o disabilitata.
Voci di menu evidenziate
Il sistema evidenzia automaticamente le voci di menu nei menu quando l'utente le seleziona. Tuttavia, l'evidenziazione può essere aggiunta o rimossa in modo esplicito da un nome di menu nella barra dei menu usando la funzione HiliteMenuItem. Questa funzione non ha alcun effetto sulle voci di menu nei menu. Quando hiliteMenuItem viene usato per evidenziare un nome di menu, tuttavia, il nome sembra essere selezionato solo. Se l'utente preme il tasto INVIO, l'elemento evidenziato non viene scelto. Questa funzionalità può essere utile, ad esempio, in un'applicazione di training che illustra l'uso dei menu.
Voci di menu disegnate dal proprietario
Un'applicazione può controllare completamente l'aspetto di una voce di menu usando un elemento disegnato dal proprietario. Gli elementi disegnati dal proprietario richiedono che un'applicazione assuma la responsabilità totale per il disegno selezionato (evidenziato), selezionato e cancellato stati. Ad esempio, se un'applicazione ha fornito un menu del tipo di carattere, potrebbe disegnare ogni voce di menu utilizzando il tipo di carattere corrispondente; l'elemento per Roman verrebbe disegnato con roman, l'elemento per italico verrebbe disegnato in corsivo e così via. Per altre informazioni, vedere Creazione di voci di menu create dal proprietario.
Separatori di voci di menu e interruzioni di riga
Il sistema fornisce un tipo speciale di voce di menu, denominato separatore, che viene visualizzato come linea orizzontale. È possibile usare un separatore per dividere un menu in gruppi di elementi correlati. Non è possibile utilizzare un separatore in una barra dei menu e l'utente non può selezionare un separatore.
Quando una barra dei menu contiene più nomi di menu che si adattano a una riga, il sistema esegue il wrapping della barra dei menu suddividendolo automaticamente in due o più righe. È possibile che si verifichi un'interruzione di riga in una voce specifica di una barra dei menu assegnando il flag di tipo MFT_MENUBREAK all'elemento. Il sistema inserisce l'elemento e tutti gli elementi successivi in una nuova riga.
Quando un menu contiene più voci di quelle che saranno incluse in una colonna, il menu verrà troncato. È possibile che si verifichi un'interruzione di colonna in una voce specifica in un menu assegnando il flag di tipo MFT_MENUBREAK all'elemento o usando l'opzione MENUBREAK nell'istruzione MENUITEM . Il sistema inserisce l'elemento e tutti gli elementi successivi in una nuova colonna. Il flag di tipo MFT_MENUBARBREAK ha lo stesso effetto, ad eccezione del fatto che viene visualizzata una linea verticale tra la nuova colonna e quella precedente.
Se si usano le funzioni AppendMenu, InsertMenu o ModifyMenu per assegnare interruzioni di riga, è necessario assegnare i flag di tipo MF_MENUBREAK o MF_MENUBARBREAK.
Messaggi usati con i menu
Il sistema segnala l'attività correlata al menu inviando messaggi alla routine della finestra della finestra proprietaria del menu. Il sistema invia una serie di messaggi quando l'utente seleziona voci sulla barra dei menu o fa clic sul pulsante destro del mouse per visualizzare un menu di scelta rapida.
Quando l'utente attiva una voce sulla barra dei menu, la finestra del proprietario riceve prima un messaggio di WM_SYSCOMMAND . Questo messaggio include un flag che indica se l'utente ha attivato il menu usando la tastiera (SC_KEYMENU) o il mouse (SC_MOUedizione Standard MENU). Per altre informazioni, vedere Accesso tramite tastiera ai menu.
Prima di visualizzare i menu, il sistema invia quindi il messaggio WM_INITMENU alla routine della finestra in modo che un'applicazione possa modificare i menu prima che vengano visualizzati dall'utente. Il sistema invia il messaggio di WM_INITMENU una sola volta per attivazione di menu.
Quando l'utente punta a una voce di menu che apre un sottomenu, il sistema invia la finestra del proprietario il messaggio WM_INITMENUPOPUP prima di visualizzare il sottomenu. Questo messaggio offre all'applicazione l'opportunità di modificare il sottomenu prima che venga visualizzato.
Ogni volta che l'utente sposta l'evidenziazione da un elemento a un altro, il sistema invia un messaggio WM_MENUedizione Standard LECT alla routine della finestra del proprietario del menu. Questo messaggio identifica la voce di menu attualmente selezionata. Molte applicazioni forniscono un'area informazioni nella parte inferiore delle finestre principali e usano questo messaggio per visualizzare informazioni aggiuntive sulla voce di menu selezionata.
Quando l'utente sceglie una voce di comando da un menu, il sistema invia un messaggio WM_COMMAND alla routine della finestra. La parola in ordine basso del parametro wParam del messaggio di WM_COMMAND contiene l'identificatore dell'elemento scelto. La procedura della finestra deve esaminare l'identificatore ed elaborare il messaggio di conseguenza.
È possibile salvare le informazioni per un menu utilizzando la struttura MENUINFO . Se il menu è definito con menuINFO.valore dwStyle di MNS_NOTIFYBYPOS, il sistema invia WM_MENUCOMMAND anziché il WM_COMMAND quando viene selezionato un elemento. In questo modo è possibile accedere alle informazioni nella struttura MENUINFO e fornisce direttamente l'indice dell'elemento selezionato.
Non tutti i menu sono accessibili tramite la barra dei menu di una finestra. Molte applicazioni visualizzano menu di scelta rapida quando l'utente fa clic sul pulsante destro del mouse in una posizione specifica. Tali applicazioni devono elaborare il messaggio WM_CONTEXTMENU e visualizzare un menu di scelta rapida, se appropriato. Se un'applicazione non visualizza un menu di scelta rapida, deve passare il messaggio WM_CONTEXTMENU alla funzione DefWindowProc per l'elaborazione predefinita.
Il messaggio WM_MENURBUTTONUP viene inviato quando l'utente rilascia il pulsante destro del mouse mentre il cursore si trova su una voce di menu. Questo messaggio viene fornito in modo che le applicazioni possano visualizzare un menu di scelta rapida o sensibile al contesto per una voce di menu.
Ci sono alcuni messaggi che coinvolgono solo menu di trascinamento della selezione. Il WM_MENUGETOBJECT viene inviato al proprietario di un menu di trascinamento della selezione quando il cursore del mouse entra in una voce di menu o si sposta dal centro di un elemento all'inizio o nella parte inferiore di un elemento. Il messaggio WM_MENUDRAG viene inviato quando l'utente trascina effettivamente una voce di menu.
Quando un menu a discesa o un sottomenu è stato eliminato definitivamente, il sistema invia un messaggio WM_UNINITMENUPOPUP.
Distruzione menu
Se un menu viene assegnato a una finestra e tale finestra viene eliminata definitivamente, il sistema elimina automaticamente il menu e i relativi sottomenu, liberando l'handle del menu e la memoria occupata dal menu. Il sistema non elimina automaticamente un menu non assegnato a una finestra. Un'applicazione deve eliminare definitivamente il menu non assegnato chiamando la funzione DestroyMenu. In caso contrario, il menu continua a esistere in memoria anche dopo la chiusura dell'applicazione. Per terminare il menu attivo del thread chiamante, usare EndMenu. Se una piattaforma non supporta EndMenu, inviare al proprietario del menu attivo un messaggio di WM_CANCELMODE.